scala案例类等于(=)未按预期工作
我一定是错过了什么傻事。我有这个:scala案例类等于(=)未按预期工作,scala,equality,case-class,Scala,Equality,Case Class,我一定是错过了什么傻事。我有这个: 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 o
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)
为什么不呢?从Case类继承Case类(或对象)是一种不好的做法,从Scala 2.9.1开始是非法的。使用
对象
而不是案例对象
来定义红色
、绿色
和蓝色
为什么会这样?Green是一个伴生对象,c是一个实例。它们不相等。我认为这是一个相关的问题:“为什么它扩展的case对象和case类不相等”
使用Scala 2.12.2
我在您的示例中添加了以下行,现在object等于类实例
object Black extends Color(0x00000000)
val black1 = Color(0x00000000)
black1 == Black
res1:Boolean=truecase object create
等于,hashcode
和apply/unapply
。为什么这是一种不好的做法?@Amir Raminfar:不,实际上在这种情况下不是这样,因为这些方法已经存在于Color
上,而case
只会在这些方法尚未被覆盖的情况下创建它们@4e6:如果您仍然从case类继承,则使用对象
或case对象
并不重要!啊,你的意思是把一个案例分类。我认为你应该改变措辞,因为听起来你好像在说使用case objects
通常是不好的。@Alexey Romanov,问题是案例间的继承性。如果一个非case对象从case类继承,则没有关系。我更新了答案来澄清这一点。谢谢,@kipton。这就是我的意思。这是一个案例间继承的bug,现在是非法的。当从对象中删除case修饰符时,代码会起作用,因为case类上的==
定义会检查参数的相等性(这里,rgb
)。顺便说一下,Green
不是classColor
的伴生对象。伴随对象需要与trait/类具有相同的名称,并且(我认为)需要在同一个文件中定义。关于为什么伴生对象有用的更多信息:另一个提示:Color
的参数中的val
是多余的,因为Color
是一个case类。可以这样说:case-class-Color(rgb:Int)
是的,这是一个很晚才添加的颜色,因为我正试图让它像我预期的那样工作;既然你提到了,我记得不需要了。