Scala:忽略equals/hascode的case类字段?

Chu*_*ucK 34 scala class pattern-matching

是否可以忽略case类的equals/haschode方法中的case类的字段?

我的用例是我有一个字段,它基本上是类中其余数据的元数据.

ret*_*nym 80

仅考虑第一个参数部分中的参数是否相等和散列.

scala> case class Foo(a: Int)(b: Int)
defined class Foo

scala> Foo(0)(0) == Foo(0)(1)
res0: Boolean = true

scala> Seq(0, 1).map(Foo(0)(_).hashCode)
res1: Seq[Int] = List(-1669410282, -1669410282)
Run Code Online (Sandbox Code Playgroud)

UPDATE

b作为字段公开:

scala> case class Foo(a: Int)(val b: Int)
defined class Foo

scala> Foo(0)(1).b
res3: Int = 1
Run Code Online (Sandbox Code Playgroud)

  • @KenBloom如果在"b"之前添加"val"它将起作用:case class Foo(a:Int)(val b:Int) (2认同)

mis*_*tor 5

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

case class Foo private(x: Int, y: Int) {
  def fieldToIgnore: Int = 0
}

object Foo {
  def apply(x: Int, y: Int, f: Int): Foo = new Foo(x, y) {
    override lazy val fieldToIgnore: Int = f
  }
}

// Exiting paste mode, now interpreting.

defined class Foo
defined module Foo

scala> val f1 = Foo(2, 3, 11)
f1: Foo = Foo(2,3)

scala> val f2 = Foo(2, 3, 5)
f2: Foo = Foo(2,3)

scala> f1 == f2
res45: Boolean = true

scala> f1.## == f2.##
res46: Boolean = true
Run Code Online (Sandbox Code Playgroud)

.toString如有必要,您可以覆盖.