8
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

Buffer および List オブジェクトを true の結果と比較できるのはなぜですか?

私はいつも、彼らは異なるクラスから来ているので、比較すると偽でなければならないと思っていました. なぜこのように実装されているのか、誰かが私に説明できますか?

4

2 に答える 2

17

http://www.scala-lang.org/docu/files/collections-api/collections_41.htmlから

コレクション ライブラリには、等価性とハッシュに対する統一されたアプローチがあります。アイデアは、まず、コレクションをセット、マップ、およびシーケンスに分割することです。異なるカテゴリのコレクションは常に等しくありません。たとえば、Set(1, 2, 3) と List(1, 2, 3) は同じ要素を含んでいますが、等しくありません。一方、同じカテゴリ内では、コレクションが同じ要素を持っている場合に限り、コレクションは同等です (シーケンスの場合: 同じ順序の同じ要素)。たとえば、List(1, 2, 3) == Vector(1, 2, 3)、および HashSet(1, 2) == Treeset(2, 1) です。

コレクションが変更可能か不変かは、等価チェックには関係ありません。(...)

これは、scala.collection.mutable.Buffer と List が同じカテゴリ (シーケンス) に属し、同等性が同等の要素を持つと定義されているためです。

于 2012-06-20T19:23:17.173 に答える
3

ListBufferは両方scala.collection.Seqです。それらには、列挙できる要素(つまり、最初の要素、2番目の要素など)があり、複製されている可能性があります。

List一方がaで、もう一方がaであるという事実は、Buffer単なる実装の詳細です。

より良い質問は、なぜanscala.collection.immutable.Seqとascala.collection.mutable.Seqが等しくなることができるのかということであり、答えは、それらがどのように比較されるかに関して、可変性は無関係であるということです。

于 2012-06-20T19:36:27.333 に答える