检查Scala中的相同性/相等性

时间:2015-08-28 18:52:10

标签: scala collections equality

正如我在其他帖子中所提到的那样(Unique id for Scala object),似乎我不能像Python一样拥有id

我仍然需要在Scala中检查单元测试的相同性。我运行一个测试,并将一些嵌套集合对象(即List [Map [Int,...]])的返回值与我创建的值进行比较。

但是,可变映射的hashCode与不可变映射的hashCode相同。结果(x == y)返回True。

scala> val x = Map("a" -> 10, "b" -> 20)
x: scala.collection.immutable.Map[String,Int] = Map(a -> 10, b -> 20)

scala> x.hashCode
res0: Int = -1001662700 

scala> val y = collection.mutable.Map("b" -> 20, "a" -> 10)
y: scala.collection.mutable.Map[String,Int] = Map(b -> 20, a -> 10)

scala> y.hashCode
res2: Int = -1001662700

在某些情况下,没关系,但在其他情况下,我可能需要让它测试失败。所以,这是我的问题。

  • Q1:比较两个值(包括非常复杂的数据类型)的常用方法是什么?我可以比较toString()结果,但我认为这不是一个好主意。

  • Q2:可变数据结构是否具有与不可变对应物相同的hashCode一般规则?

1 个答案:

答案 0 :(得分:1)

您正在寻找具有引用相等性的AnyRef.eq(尽可能接近Python id函数,如果您只想比较引用,则相同并且您不关心实际ID):

scala> x == y
true

scala> x eq y
false