Предположим, что я хочу написать класс case Stepper
следующим образом:
case class Stepper(step: Int) {def apply(x: Int) = x + step}
Он поставляется с красивой реализацией toString
:
scala> Stepper(42).toString
res0: String = Stepper(42)
но это не действительно функция:
scala> Some(2) map Stepper(2)
<console>:10: error: type mismatch;
found : Stepper
required: Int => ?
Some(2) map Stepper(2)
Обходной путь заключается в реализации признака Function
...
case class Stepper(step: Int) extends (Int => Int) {def apply(x: Int) = x + step}
Но тогда я не могу получить бесплатную реализацию toString:
scala> Stepper(42).toString
res2: java.lang.String = <function1>
Тогда возникает вопрос: могу ли я иметь лучшее из этих двух миров? Есть ли решение, где у меня есть хорошая реализация toString
для бесплатного И реализация признака Function
. Другими словами, существует ли способ применения линеаризации таким образом, чтобы наконец был применен синтаксический сахар case class
?