2012-01-07 7 views
20

Il tutorial Scala afferma che Int 's aggiungere operazione è in realtà una chiamata di metodo: 1+1 significa 1.+(1)Confuso dalle definizioni operatore di Int a Scala

Ma quando guardo nel codice sorgente di Int.scala, sembra che il il metodo semplicemente stamperà un messaggio di errore. Qualcuno potrebbe spiegarmi come funziona?

def +(x: Int): Int = sys.error("stub") 

risposta

25

Int è un value class, che è leggermente diverso rispetto alle altre classi. Non c'è modo di esprimere l'aggiunta primitiva in scala senza entrare in una definizione ricorsiva. Per esempio, se la definizione di + era,

def +(x: Int): Int = this + x 

quindi chiamando + invocherebbe + che invocare + che ...

Scala ha bisogno di compilare i metodi su classi di valore nei codici Java byte per l'aggiunta/sottrazione/etc.

Il compilatore compila + nel bytecode java per l'aggiunta, ma gli autori della libreria scala hanno scritto Int.scala con i metodi di stub per trasformarlo in un valido file sorgente di scala. Questi metodi di stub non vengono mai effettivamente invocati.

7

Come dice l'implementazione, quel metodo è uno stub. Apparentemente la sua implementazione è fornita dal compilatore Scala quando il codice è compilato, perché int + int è un'operazione primitiva e il linguaggio Scala non ha esso stesso le primitive - solo il compilatore conosce le primitive sulla JVM.

7

È importante rendersi conto che gli operatori sono metodi per il modo in cui si interagisce con la lingua. Cose come + su Int si comportano come qualsiasi altro metodo in Scala, invece di essere qualcosa che gioca secondo le proprie regole.

Tuttavia, a livello attuazione, non sono affatto metodi: a JVM solo le classi hanno metodi e le AnyVal sottoclassi non sono classi quanto la JVM è interessato. Non sorprende che a livello di implementazione agiscano principalmente come primitive Java.

Problemi correlati