Предположим, что я хочу написать класс 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
синтаксический сахар применялся наконец?