2009-10-22 5 views
0

@lucastex posted sur l'opérateur Java Elvis et moi avons essayé quelque chose dans Scala pour obtenir le même effet.Scala: 2 Implicite convertions moyen d'invoquer

Je viens de tout convertir en un nouveau type structurel avec l'opérateur ?: prenant un objet du même type que l'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 name ?: "Lucas" obtient "Lucas" et name.?:{"Lucas"} obtient Paulo? Le nouveau type de construction est censée retourner la valeur initiale de quoi que ce soit si elle est non nul, c'est "Paulo" dans le code ci-dessus.

Je suis un peu confus. Toute explication?

Répondre

6

Votre opérateur se termine par :, ce qui signifie qu'il se lit de droite à gauche lorsque la notation infixe. Par exemple:

scala> 1 :: Nil == Nil.::(1) 
res2: Boolean = true 

Toutes les méthodes lues de gauche à droite en notation point, cependant. Vous appliquez donc votre méthode à Lucas dans la notation infixée et à name dans la notation par points.

Par ailleurs, l'opérateur Elvis était not accepted inclus dans Java 7.

+0

Oh Mon Dieu! Tu as raison! Page 223 dans O'Reilly Programming Scala. Merci! – paulosuzart

Questions connexes