Scala: класс значений против класса дел
Я пытаюсь обнаружить различия между использованием класса значения или класса дела в данном сценарии. Предположим, я хочу смоделировать 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?
1 ответ
Вам не нужно implicit ev: Numeric[IntegerMod5]
в качестве аргумента просто определите его в сопутствующем объекте:
object IntegerMod5 {
implicit val numeric: Numeric[IntegerMod5] = ...
}
Он будет автоматически выбран при использовании арифметических операций над IntegerMod5
с, и потому что это val
, он инициализируется только один раз (вы можете использовать object
также).