26

私が理解している限り、Scala==は2つのオブジェクトの自然な平等を定義しています。

Array(0,1,2) == Array(0,1,2)私はそれが自然の平等を比較することを期待しました。たとえば、他の配列の対応する要素と比較したときに、配列のすべての要素がtrueを返すかどうかを確認します。

人々は、Scalaはアイデンティティを比較するArrayだけのJavaだと私に言いました。代わりに、自然の平等を比較するためにのメソッドを[]オーバーライドする方が意味がありませんか?Arrayequals

4

3 に答える 3

20

Scala 2.7はJava配列に機能を追加しようとし[]ましたが、問題のあるコーナーケースに遭遇しました。Scala 2.8はそれを宣言していますArray[T]T[]、ラッパーと同等のものを提供します。

2.8で次のことを試してください(編集/注:RC3の時点でGenericArrayは、ArraySeqこれを指摘してくれたレトロニムに感謝します):

import scala.collection.mutable.{GenericArray=>GArray, WrappedArray=>WArray}
scala> GArray(0,1,2) == GArray(0,1,2)
res0: Boolean = true

scala> (Array(0,1,2):WArray[Int]) == (Array(0,1,2):WArray[Int])
res1: Boolean = true

GenericArrayArrayすべてのScalaコレクショングッズが追加されていることを除いて、と 同じように機能します。Java配列をWrappedArrayラップします。[]上記では、プレーン配列をキャストして(暗黙の変換関数を呼び出すよりも簡単です)、ラップされた配列を比較しました。これらのラッパーは、[]配列に支えられていますが、すべてのコレクションの機能も提供します。

于 2010-03-20T00:26:15.787 に答える
9

Scalaは、それが不可能であるため、配列の等式をオーバーライドしません。サブクラス化する場合にのみメソッドをオーバーライドできます。Arrayはサブクラス化されていないため(これは不可能です)、Scalaはそのメソッドをオーバーライドできません。

于 2010-03-20T01:22:01.147 に答える
5

しかし、Scalaの文字列も単なるJava文字列ですが、Scalaはequalsをオーバーライドして、自然な同等性を比較します。

Scalaはそこで何もオーバーライドしません。java.lang.Stringの値に依存する実装がありますequals()(他の多くのJavaクラスと同様ですが、配列とは異なります)。

于 2010-03-19T23:35:49.703 に答える