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

Checking sameness/equality in Scala

提问人:prosseek 提问时间:8/29/2015 最后编辑:Communityprosseek 更新时间:8/29/2015 访问量:295

问:

正如我在另一篇文章中问的那样(Scala 对象的唯一 id),我似乎不能像 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是一般规则吗?

Scala 集合 相等

评论


答:

1赞 Sean Vieira 8/29/2015 #1

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

scala> x == y
true

scala> x eq y
false

评论

0赞 prosseek 8/29/2015
好吧,我不认为“eq”是一种在单元测试中使用的可能方法,有时需要我将返回值与我需要当场制作的值进行比较。
0赞 Sean Vieira 8/29/2015
您想检查返回的值是否等于您无权访问的内容?
3赞 Sean Vieira 8/29/2015
啊,所以你想要自定义相等性检查 - 你最好的选择可能是 scalactic 的 TypeCheckedTripleEquals