单个元素列表具有相同的头但不相等?

时间:2017-01-04 19:08:58

标签: scala

鉴于两个List[A]个实例,在什么情况下可能会出现以下情况?

list.head == otherList.head // returns true
list.size == 1              // returns true
list.size == otherList.size // returns true

list == otherList // returns false

1 个答案:

答案 0 :(得分:3)

如果我可以欺骗并使用我自己的A,那么这就是一个例子:

scala> :pa
// Entering paste mode (ctrl-D to finish)

class MyClass(val v: Int)
{
    def ==(that: MyClass): Boolean = true
}

// Exiting paste mode, now interpreting.

defined class MyClass

scala> val l1 = List(new MyClass(1))
l1: List[MyClass] = List(MyClass@36776c32)

scala> val l2 = List(new MyClass(2))
l2: List[MyClass] = List(MyClass@39c87b42)

scala> l1.head == l2.head
res4: Boolean = true

scala> l1.size == l2.size
res5: Boolean = true

scala> l1.size == 1
res6: Boolean = true

scala> l1 == l2
res7: Boolean = false

你甚至不需要为此提供可变值,这只是一个使用我自己的==方法的技巧。但这是故意恶意的,希望没有人会编写可以做到这一点的代码。

修改

您需要做的就是a)技巧/中断==,就像我对MyClass所做的那样,或者正如@ 2rs2ts指出的那样,欺骗/打破sameElements检查(使用!=):

def sameElements[B >: A](that: GenIterable[B]): Boolean = {
    val these = this.iterator
    val those = that.iterator
    while (these.hasNext && those.hasNext)
        if (these.next != those.next)
            return false
    !these.hasNext && !those.hasNext
}