2012-06-20 14 views
7
scala> import scala.collection.mutable.Buffer 
import scala.collection.mutable.Buffer 

scala> val b = Buffer(1, 2, 3) 
b: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3) 

scala> val l = List(1, 2, 3) 
l: List[Int] = List(1, 2, 3) 

scala> b == l 
res1: Boolean = true 

Tôi đã tự hỏi, tại sao đối tượng Đệm và Danh sách có thể được so sánh với kết quả của sự thật?Tại sao các đối tượng Bộ đệm và Danh sách bằng nhau (thậm chí chúng là từ các lớp khác nhau)?

Tôi luôn nghĩ rằng, bởi vì chúng đến từ các lớp khác nhau, chúng là sai khi so sánh. Ai đó có thể giải thích cho tôi, tại sao nó được thực hiện theo cách này?

Trả lời

17

Từ http://www.scala-lang.org/docu/files/collections-api/collections_41.html

Các thư viện bộ sưu tập có một cách tiếp cận thống nhất để bình đẳng và băm. Ý tưởng là, trước tiên, để chia các bộ sưu tập thành các bộ, bản đồ và các chuỗi. Các bộ sưu tập trong các danh mục khác nhau luôn không bằng nhau. Ví dụ, Set (1, 2, 3) là không bình đẳng với Danh sách (1, 2, 3) mặc dù chúng chứa các phần tử giống nhau. Mặt khác, trong cùng một danh mục, các bộ sưu tập bằng nhau nếu và chỉ khi chúng có cùng các phần tử (đối với các chuỗi: các phần tử giống nhau trong cùng một dấu nháy). Ví dụ: Danh sách (1, 2, 3) == Vector (1, 2, 3) và HashSet (1, 2) == Treeset (2, 1).

Việc kiểm tra bình đẳng không quan trọng liệu bộ sưu tập có thể thay đổi hoặc không thay đổi hay không. (...)

Vì vậy, đó là vì scala.collection.mutable.Buffer và Danh sách thuộc cùng một danh mục (chuỗi) và bình đẳng được xác định là có các phần tử bằng nhau.

+2

Ngoại trừ 'Danh sách (1, 2, 3) == Mảng (1, 2, 3)' trả về 'sai'! 'Array' là một trường hợp đặc biệt, do thực tế rằng phương thức' == 'trên' Array' là phương thức Java nguyên gốc, không tuân theo logic bộ sưu tập Scala tổng thể. Ngoài ra, trong liên kết mà bạn đang trỏ đến, văn bản hiện nói 'Danh sách (1, 2, 3) == Vector (1, 2, 3)'. Tôi đã chỉnh sửa câu trả lời của bạn để sửa lỗi này. – ebruchez

3

ListBuffer đều là scala.collection.Seq. Chúng có các phần tử, có thể được nhân bản, có thể được liệt kê (ví dụ, phần tử đầu tiên, phần tử thứ hai, v.v.).

Thực tế là một là List và một khác Buffer chỉ là chi tiết triển khai.

Câu hỏi hay hơn là lý do tại sao một số scala.collection.immutable.Seqscala.collection.mutable.Seq có thể bằng nhau và câu trả lời là khả năng thay đổi không liên quan đến cách so sánh chúng.

+0

Cảm ơn bạn đã cung cấp thêm thông tin! –

Các vấn đề liên quan