我试图发现在给定场景中使用值类和事例类之间的区别。假设我想将整数mod 5建模为一个唯一的数据类型。问题是我应该从哪一个开始。。。
class IntegerMod5(val value: Int) extends AnyVal
case class IntegerMod5(value: Int)
无论如何,我似乎可以很容易地创建Numeric
的实现。使用案例类方法,我可以简单地这样做:
case class IntegerMod5(value: Int)(implicit ev: Numeric[IntegerMod5]) {
import ev.mkNumericOps
}
然而,对于价值阶级来说,这似乎是一项困难得多的努力,主要是因为其好处是避免对象创造。因此,类似的东西
implicit class IntegersMod5Ops(value: IntegerMod5)(implicit ev: Numeric[IntegerMod5]) {
import ev.mkNumericOps
}
似乎在很大程度上违背了目的。(实际上,不确定它是否有效。)
问题是,是否可以将Numeric
与值类一起使用,或者我是否必须咬紧牙关使用case类?
您不需要implicit ev: Numeric[IntegerMod5]
作为参数,只需在配套对象中定义即可:
object IntegerMod5 {
implicit val numeric: Numeric[IntegerMod5] = ...
}
当您对IntegerMod5
s使用算术运算时,它将自动拾取,因为它是val
,所以它只初始化一次(您也可以使用object
)。