2013-02-27 13 views

risposta

132

Ci sono alcune cose in corso.

In primo luogo, Scala consente di omettere punti e paren da molte chiamate di metodo, pertanto 20 seconds equivale a 20.seconds() *.

In secondo luogo, viene applicata una "conversione implicita". Dal momento che è un 20Int e Int ha nessun metodo seconds, il compilatore cerca una conversione implicita che prende un Int e restituisce qualcosa che ha un metodo seconds, con la ricerca limitata dalla portata del vostro metodo di chiamata.

Hai importato DurationInt nel tuo ambito. Poiché DurationInt è una classe implicita con un parametro Int, il suo costruttore definisce una conversione implicita Int => DurationInt. DurationInt ha un metodo seconds, quindi soddisfa tutti i criteri di ricerca. Pertanto, il compilatore riscrive la chiamata come new DurationInt(20).seconds **.

* Intendo questo in modo approssimativo. 20.seconds() non è effettivamente valido perché il metodo seconds non ha alcun elenco di parametri e pertanto il par.1deve essere omesso nella chiamata al metodo.

** In realtà, questo non è del tutto vero, perché DurationInt è una classe di valore, in modo che il compilatore eviterà avvolgendo il numero intero, se possibile.

+66

Qualsiasi tecnologia sufficientemente avanzata è indistinguibile dalla magia. – ripper234

+4

Fortunatamente la maggior parte degli IDE sono in grado di distinguerla! Le conversioni implicite vengono utilizzate parecchio in Scala. Se stai leggendo il file di testo, potrebbe essere fonte di confusione ("da dove viene quel metodo") ma con il supporto degli strumenti appropriato dovresti essere in grado di orientarti, a quel punto Scala può essere magnificamente significativa e concisa. (ad esempio, 20.seconds è molto più leggibile di 'new DurationInt (20) .seconds()' finché sai come funziona) –

+1

Se ti trovi a usare impliciti, chiediti sempre se c'è un modo per raggiungere la stessa cosa senza il loro aiuto. http://twitter.github.com/effectivescala/#Types and Generics-Implicits – oluies

6

La "magia" che si sta verificando è chiamata "conversione implicita". Stai importando le conversioni implicite e alcune di esse gestiscono la conversione tra Int (e Double) in Durata. Questo è quello che hai a che fare.

Problemi correlati