Załóżmy, że chcę napisać klasę case Stepper
następująco:klasa Case i linearyzacji cech
case class Stepper(step: Int) {def apply(x: Int) = x + step}
Pochodzi z ładnym toString
realizacji:
scala> Stepper(42).toString
res0: String = Stepper(42)
ale to naprawdę nie jest funkcją :
scala> Some(2) map Stepper(2)
<console>:10: error: type mismatch;
found : Stepper
required: Int => ?
Some(2) map Stepper(2)
Obejście polega na wdrożeniu Function
cecha ...
case class Stepper(step: Int) extends (Int => Int) {def apply(x: Int) = x + step}
Ale wtedy, nie mogę mieć za darmo ładnym realizacji toString już:
scala> Stepper(42).toString
res2: java.lang.String = <function1>
Potem, pytanie brzmi: Mogę mieć najlepsze z tych dwóch światów ? Czy istnieje rozwiązanie, w którym mam ładne wdrożenie toString
za darmo i implementacji cechy Function
. Innymi słowy, czy istnieje sposób na zastosowanie linearyzacji w taki sposób, że na koniec stosuje się cukier syntaktyczny case class
?
Tak, to nie jest naprawdę linearyzacja, ale nie znalazłem żadnej innej odpowiedniej nazwy dla tego. I tego rodzaju sztuczki spodziewałem się, dzięki. – Nicolas
@Nicolas Rozumiem Cię bardzo dobrze, często stwierdzam, że trudno jest opisać problem dokładnie wtedy, gdy nie jestem pewien, co się dzieje. –
@ Vlad: Zawsze unikałem używania czegokolwiek z 'scala.runtime', które nie pojawia się w dokumentach API Scala. Zgadzam się, że jest to sprytne rozwiązanie, ale czy naprawdę uważasz, że warto, biorąc pod uwagę, że istnieją równie dobre rozwiązania, które wykorzystują proste, stare funkcje językowe Scala? –