Supposons que je veux écrire une classe de cas Stepper
comme suit:classe de cas et Linéarisation des traits
case class Stepper(step: Int) {def apply(x: Int) = x + step}
Il est livré avec une belle mise en œuvre toString
:
scala> Stepper(42).toString
res0: String = Stepper(42)
mais ce n'est pas vraiment une fonction :
scala> Some(2) map Stepper(2)
<console>:10: error: type mismatch;
found : Stepper
required: Int => ?
Some(2) map Stepper(2)
Une solution de contournement consiste à implémenter le Function
trait ...
case class Stepper(step: Int) extends (Int => Int) {def apply(x: Int) = x + step}
Mais alors, je ne peux pas avoir gratuitement une belle mise en œuvre toString plus:
scala> Stepper(42).toString
res2: java.lang.String = <function1>
Ensuite, la question est la suivante: je peux avoir le meilleur de ces deux mondes ? Y at-il une solution où j'ai la belle toString
mise en œuvre gratuitement et une mise en œuvre de trait Function
. En d'autres termes, existe-t-il un moyen d'appliquer la linéarisation de telle sorte que le sucre syntaxique soit enfin appliqué?
Oui, ce n'est pas vraiment la linéarisation, mais je n'ai trouvé aucun autre nom approprié pour cela. Et c'était le genre de truc auquel je m'attendais, merci. – Nicolas
@Nicolas Je vous comprends très bien, je me trouve souvent que c'est souvent difficile de décrire un problème exactement quand je ne suis pas sûr de ce qui se passe. –
@Vlad: J'ai toujours évité d'utiliser quoi que ce soit de 'scala.runtime' qui n'apparaisse pas dans les docs de l'API Scala. Je suis d'accord que c'est une solution de contournement astucieuse, mais pensez-vous vraiment que cela en vaut la peine, étant donné qu'il existe des solutions tout aussi bonnes qui utilisent de vieilles fonctionnalités de langage Scala? –