【问题标题】:scala case class equals (==) not working as expectedscala案例类等于(==)没有按预期工作
【发布时间】:2011-08-23 19:59:33
【问题描述】:

我一定在这里遗漏了一些愚蠢的东西。我有这个:

case class Color(val rgb:Int) {
   private val c = rgb - 0xff000000
   val r = (c & 0xff0000) >> 16
   val g = (c & 0x00ff00) >> 8
   val b = (c & 0x0000ff)
}

case object Red extends Color(0xffff0000)
case object Green extends Color(0xff00ff00)
case object Blue extends Color(0xff0000ff)

然后我希望这会打印出 true

val c = Color(0xff00ff00)
println(c == Green)

为什么不呢??

【问题讨论】:

  • 另一个提示:Color 的参数中的val 是多余的,因为Color 是一个案例类。说一句就够了:case class Color(rgb: Int)
  • 是的,这是一个较晚的添加,因为我试图让它按预期工作;既然你提到它,我记得它是不需要的。

标签: scala equality case-class


【解决方案1】:

从案例类继承的案例类(或对象)是一种不好的做法,并且从 Scala 2.9.1 开始是非法的。使用object 而不是case object 来定义RedGreenBlue

【讨论】:

  • 案例对象创建equalshashcodeapply/unapply。为什么这是不好的做法?
  • @Amir Raminfar:不,在这种情况下实际上没有,因为Colorcase 上已经存在这些方法,如果它们还没有被覆盖,它们只会创建这些方法。 @4e6:如果您仍然从案例类继承,则使用 objectcase object 都没关系!
  • 啊,你的意思是继承一个案例类。我认为您应该更改措辞,因为听起来您在说使用case objects 通常是不好的。
  • @Alexey Romanov ,问题是个案继承。如果非案例对象继承自案例类,则可以。我更新了答案以澄清这一点。
  • 谢谢,@kipton。我就是这个意思。
【解决方案2】:

为什么应该这是真的?绿色是伴随对象,c 是实例。它们相等。

【讨论】:

  • 这是一个case-to-case继承的错误,现在是非法的。当从对象中删除 case 修饰符时,代码会起作用,因为 case 类上的 == 的定义会检查参数的相等性(此处为 rgb)。顺便说一句,Green 不是类Color 的伴随对象。伴随对象需要与特征/类具有相同的名称,并且(我认为)需要在同一个文件中定义。更多关于为什么伴随对象有用的信息:stackoverflow.com/questions/609744/…
【解决方案3】:

我认为这是一个相关的问题:“为什么案例对象和它扩展的案例类不相等”。

使用 Scala 2.12.2

我在您的示例中添加了以下几行,现在 object 等于类实例。

object Black extends Color(0x00000000)
val black1 = Color(0x00000000)
black1 == Black

res1: Boolean = true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多