0

同じキーを持つ scala.collection.immutable.Map で連続ルックアップを行うアプリケーションがあるため、2 つの異なる参照が返されます。以下のようなもの:

val v1 = m(key)
val v2 = m(key)
require(v1 eq v2) // fails!

私は小さな例でこの動作を再現できませんでした.これが合理的/予想される状況があるかどうか疑問に思っています. アプリケーションはシングル スレッドであり、ルックアップを次々に実行することで問題を切り分けました。

4

2 に答える 2

1

マップは不変ですが、マップに使用するキーは変更可能であるか、不正確hashcodeで、equals非決定論的な結果を返す実装を持っている可能性はありますか? 使用するタイプは何ですか?

REPL の誇張された例:

scala> import scala.util.Random
import scala.util.Random

scala> class BadKey(val value: Int) {
     |   override def hashCode = Random.nextInt(Int.MaxValue)
     | 
     |   override def equals(x: Any) = Random.nextBoolean
     | }
defined class BadKey

scala> val randMap = Map(new BadKey(1) -> 1, new BadKey(2) -> 2)
randMap: scala.collection.immutable.Map[BadKey,Int] = Map(BadKey@26132448 -> 1,     BadKey@41e1cd27 -> 2)

scala> randMap.get(new BadKey(1))
res6: Option[Int] = Some(1)

scala> randMap.get(new BadKey(1))
res7: Option[Int] = Some(2)

scala> randMap.get(new BadKey(1))
res8: Option[Int] = Some(1)

scala> randMap.get(new BadKey(1))
res9: Option[Int] = Some(1)

scala> randMap.get(new BadKey(1))
res10: Option[Int] = Some(1)

scala> randMap.get(new BadKey(1))
res11: Option[Int] = None
于 2013-10-09T00:38:26.907 に答える
1

参照の等価性をテストしていると思われます。この場合、v1 と v2 は異なるオブジェクトです。ケース クラスを作成しない限り、参照の等価性はクラスの既定値です。

于 2013-10-08T23:51:47.540 に答える