Scala:价值等级与案例等级

时间:2016-01-01 04:56:17

标签: scala case-class value-class

我试图发现在给定方案中使用值类或案例类之间的差异。假设我想将整数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与价值类一起使用,或者我必须咬紧牙关并使用案例类?

1 个答案:

答案 0 :(得分:1)

您不需要implicit ev: Numeric[IntegerMod5]作为参数,只需在随播对象中定义它:

object IntegerMod5 {
  implicit val numeric: Numeric[IntegerMod5] = ...
}

当您在IntegerMod5上使用算术运算时会自动拾取它,并且因为它是val,它只会被初始化一次(您也可以使用object)。< / p>