1

我试图发现在给定场景中使用值类或案例类之间的区别。假设我想将整数 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与值类一起使用,还是我必须硬着头皮使用案例类?

4

1 回答 1

1

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

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

当你对 s 使用算术运算时,它会被自动拾取IntegerMod5,因为它是 a val,所以它只初始化一次(你也可以使用object)。

于 2016-01-01T06:35:21.350 回答