Conversions Scala implicites: 2 façons d'invoquer
Question
@lucastex posté à propos de l'opérateur Java Elvis, et j'ai essayé quelque chose dans Scala pour obtenir le même effet.
Je viens de tout convertir en un nouveau type de structure avec l'opérateur ?:
prenant un objet du même type en argument. Alors dis:
implicit def toRockStar[B](v : B) = new {
def ?:(opt: => B) = if (v == null) opt else v}
val name: String = "Paulo" // example
Pourquoi nom?: "Lucas"
obtient "Lucas"
et nom.?: {
obtient < code> Paulo ? Le nouveau type de structure est censé renvoyer la valeur initiale de quoi que ce soit s'il n'est pas null , c'est-à-dire "Paulo"
dans le code ci-dessus.
Je suis un peu confus. Une explication?
La solution
Votre opérateur se termine par :
, ce qui signifie qu'il se lit de droite à gauche en notation infixe. Par exemple:
scala> 1 :: Nil == Nil.::(1)
res2: Boolean = true
Toutes les méthodes sont lues de gauche à droite en notation par points. Vous appliquez donc votre méthode à Lucas
dans la notation infixe et à nom
dans la notation pointée.
A propos, l'opérateur Elvis était non accepté pour inclusion dans Java 7.
Autres conseils
Pour mémoire (pour retrouver ce fil lors de la recherche de l'article suivant ...), Daniel Spiewak (un autre célèbre Daniel dans le monde de Scala ...) a publié un article sur Implémentation de l'opérateur Elvis de Groovy à Scala .