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

使用==比较Scala中的Seq对可以吗?,scala,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(Fo

考虑以下代码:

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
如何以及为什么这样做? 它似乎像预期的那样工作。我应该继续使用它吗


编辑:我不想定义一个新的操作符。我的问题是,为什么上面的工作如预期的那样,而不是我必须定义一个新的。因此,这个问题与链接的问题有点相反。

引用文档:

集合库具有统一的相等和散列方法。其思想是,首先,将集合划分为集合、映射和序列。不同类别的集合总是不相等的。例如,Set1、2、3与List1、2、3不相等,即使它们包含相同的元素。另一方面,在同一类别中,集合是相等的当且仅当它们具有相同的序列元素:相同顺序的相同元素。例如,List1,2,3==Vector1,2,3和HashSet1,2==TreeSet2,1

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


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

引用文档:

集合库具有统一的相等和散列方法。其思想是,首先,将集合划分为集合、映射和序列。不同类别的集合总是不相等的。例如,Set1、2、3与List1、2、3不相等,即使它们包含相同的元素。另一方面,在同一类别中,集合是相等的当且仅当它们具有相同的序列元素:相同顺序的相同元素。例如,List1,2,3==Vector1,2,3和HashSet1,2==TreeSet2,1

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


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

是的,它可以工作。可能您这样问是因为您熟悉Java,其中==通常只执行您想要的原语;但是Scala的==实际上是Java的等号,除了它适用于null,在少数情况下,当您希望Java的==用于对象时,它在Scala中称为eq


这也意味着要为您自己的类型更改==的行为,您应该重写equals并遵循,而不是定义==方法。

是的,它可以工作。可能您这样问是因为您熟悉Java,其中==通常只执行您想要的原语;但是Scala的==实际上是Java的等号,除了它适用于null,在少数情况下,当您希望Java的==用于对象时,它在Scala中称为eq


这也意味着,要为您自己的类型更改==的行为,您应该重写equals并遵循,而不是定义==方法。

不确定这是否重复。我不是想定义一个新的操作,而是想知道为什么内置==可以工作。按照惯例,无论何时这样做都是有意义的,Scala类都会实现值相等——如果不这样做,本质上就是一个实现错误。Scala中没有运算符,因此a==b是a.==b。a、 eqb对应于Java中的a==b。不确定这是否重复。我不是想定义一个新的操作,而是想知道为什么内置==可以工作。按照惯例,无论何时这样做都是有意义的,Scala类都会实现值相等——如果不这样做,本质上就是一个实现错误。Scala中没有运算符,因此a==b是a.==b。a、 eqb对应于Java中的a==b。这同样适用于元组和其他Scala类型吗?这似乎只是谈论收藏。你写问题的方式似乎表明你想知道两个收藏是否可以比较。关于Scala中的其他类型,以及平等在各自的情况下是如何工作的,这是一个很大的话题,因为它取决于各种因素。开始阅读Scala是如何产生它的平等语义的一个好地方是阅读以下内容:元组和其他Scala类型是否也一样?这似乎只是在谈论收藏。你写问题的方式似乎表明你想知道
如果可以比较两个集合,则返回ow。关于Scala中的其他类型,以及平等在各自的情况下是如何工作的,这是一个很大的话题,因为它取决于各种因素。阅读Scala是如何产生平等语义的一个好地方是:他使用了一个case类,因此自动生成了equals方法。他使用了一个case类,因此自动生成了equals方法。