【问题标题】:Checking sameness/equality in Scala在 Scala 中检查相同性/相等性
【发布时间】:2015-11-23 12:31:47
【问题描述】:

正如我在其他帖子 (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 是否是一般规则?

【问题讨论】:

    标签: scala collections equality


    【解决方案1】:

    您正在寻找具有引用相等性的 AnyRef.eq(与 Python 的 id 函数一样接近,如果您只想比较 references 而您不这样做,则它是相同的)不关心实际ID):

    scala> x == y
    true
    
    scala> x eq y
    false
    

    【讨论】:

    • 好吧,我不认为“eq”是在单元测试中使用的一种可能方式,有时我需要将返回值与我需要在现场制作的值进行比较。跨度>
    • 您要检查返回的值是否等于您无权访问的值?
    • 啊,所以你想要自定义相等检查 - 你最好的选择可能是 scalactic's TypeCheckedTripleEquals
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2015-08-09
    • 1970-01-01
    • 2016-03-18
    相关资源
    最近更新 更多