可以使用==比较Scala中的Seq对吗?

时间:2016-08-13 10:05:08

标签: scala

请考虑以下代码:

case class Foo(foo:Long, bar:Long)

type Bar = (Seq[Foo], Seq[Foo])

val a:Bar = (Seq(Foo(1, 2), Foo(2, 3)), Seq(Foo(3, 4), Foo(5, 6))) 

val b:Bar = (Seq(Foo(1, 2), Foo(3, 4)), Seq(Foo(3, 4))) 

val c:Bar = (Seq(Foo(1, 2), Foo(2, 3)), Seq(Foo(3, 4), Foo(5, 6))) 

a == b // false

a == c // true

这是如何以及为何有效? 它似乎按预期工作。我应该继续使用吗?

编辑:我不是要尝试定义一个新的运算符。我的问题是为什么上述工作按预期工作而不是我必须定义一个新工作。所以问题是"对面"到一个链接的。

2 个答案:

答案 0 :(得分:6)

引用文档: http://docs.scala-lang.org/overviews/collections/equality

  

集合库具有统一的平等和散列方法。首先,这个想法是将集合划分为集合,映射和序列。不同类别的馆藏总是不相等。例如,Set(1,2,3)不等于List(1,2,3),即使它们包含相同的元素。另一方面,在同一类别中,集合是相等的,当且仅当它们具有相同的元素时(对于序列:相同顺序的相同元素)。例如,List(1,2,3)== Vector(1,2,3)和HashSet(1,2)== TreeSet(2,1)。

     

对于等式检查,集合是可变的还是不可变的并不重要。对于可变集合,只需在执行相等性测试时考虑其当前元素。这意味着可变集合可能在不同时间等于不同集合,具体取决于添加或删除的元素。当使用可变集合作为散列映射中的键时,这是一个潜在的陷阱。

由于Foo是一个case类,因此会自动为你生成一个equals方法(以及其他方法),这用于确定序列中的元素是否相等。

答案 1 :(得分:2)

是的,它有效。可能你问的是因为你熟悉Java ==通常只对原语做你想做的事;但Scala的==实际上是Java的equals(除了它适用于null),在极少数情况下你想要Java ==对于对象,它在Scala中称为eq

这也意味着要更改您自己类型的==行为,您应该覆盖equals(并遵循the usual contract),而不是定义==方法。< / p>