请考虑以下代码:
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
Run Code Online (Sandbox Code Playgroud)
这是如何以及为什么有效?它似乎按预期工作.我应该继续使用吗?
编辑:我不是要尝试定义一个新的运算符.我的问题是为什么上述工作按预期工作而不是我必须定义一个新工作.所以这个问题与链接的问题有些"相反".
引用文档: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方法(以及其他方法),这用于确定序列中的元素是否相等.
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |