Scala Conversioni implicite: 2 modi per invocare
Domanda
@lucastex pubblicato circa l'operatore Java Elvis, e ho provato qualcosa alla Scala per ottenere lo stesso effetto.
Ho appena convertito tutto in un nuovo tipo strutturale con l'operatore ?:
che accetta un oggetto dello stesso tipo dell'argomento. Quindi dì:
implicit def toRockStar[B](v : B) = new {
def ?:(opt: => B) = if (v == null) opt else v}
val name: String = "Paulo" // example
Perché name?: " Lucas "
ottiene " Lucas "
e name.?:{"Lucas"}
ottiene < code> Paulo ? Il nuovo tipo strutturale dovrebbe restituire il valore iniziale di qualsiasi cosa se non è null , ovvero " Paulo "
nel codice sopra.
Sono un po 'confuso. Qualche spiegazione?
Soluzione
Il tuo operatore termina in :
, il che significa che legge da destra a sinistra quando è in notazione infissa. Ad esempio:
scala> 1 :: Nil == Nil.::(1)
res2: Boolean = true
Tuttavia, tutti i metodi vengono letti da sinistra a destra in notazione punto. Quindi stai effettivamente applicando il tuo metodo a Lucas
nella notazione infix e a name
nella notazione dot.
A proposito, l'operatore Elvis era no accettato per l'inclusione in Java 7.
Altri suggerimenti
Per la cronaca (trovando questo thread durante la ricerca del seguente articolo ...), Daniel Spiewak (un altro famoso Daniel nel mondo della Scala ...) ha pubblicato un articolo su Implementazione di Groovy & # 8217; s Elvis Operator in Scala .