2011-01-28 12 views
6

Non capisco il motivo per cui il seguente codice non viene compilato:Omettere punti quando concatenare le chiamate

class Abc 
{ 
    def b (x : String) = x + "abc" 

    def a (y : String) = 
    { 
     val ls : List[String] = y.lines toList 
     b (ls.head) 
    } 
} 

Main.scala: 8: errore: tipo non corrispondente; trovato: java.lang.String richiesto: Int b (ls.head)

Quando cambio "y.lines toList" per

y.lines.toList 

o anche per

y.lines toList; 

lo fa compilare.

Forse il compilatore capisce come

(y.lines).toList(b (ls.head)) 

o qualcosa del genere, ma io continuo a non capire le regole.

+0

È possibile inserire la dichiarazione "(y.lines) .toList (b (ls.head)) " (beh, forse l'hai fatto?) Nel REPL, per verificare che il messaggio di errore sia lo stesso. Bene - L'ho fatto, e infatti lo è. :) –

+0

Ecco perché non capisco tutti a lamentarsi di ';'. – Raphael

risposta

1

Non è ovvio, ed è una combinazione della sintassi di scelta rapida di Scala e dell'indicizzazione dell'elenco. Se volete un suggerimento, provare ridefinendo b a:

def b(x : String) = 0 

si otterrà qualche altro compilatore spazzatura indietro, ma l'errore cambierà. In breve, il compilatore Scala ti consente di omettere parens e punti per i metodi a zero o un parametro, e sappiamo che b sembra come se fosse in qualche modo incatenato .. Il problema è che anche Scala usa gli indicatori per l'indicizzazione delle liste, quindi toList, che restituisce un iteratore, può richiedere un parametro come indice della lista. Non sono sicuro di questa parte esattamente, ma sembra che una volta che si omette i punti, il lexer diventerà goloso e quando si imbatterà in un metodo che potrebbe richiedere un parametro, tenterà di passare la successiva istruzione ad esso. In questo caso, è una stringa, quindi genera un errore di sintassi.

1

È trovato il posto con questo:

(y.lines).toList(b (ls.head)) 

Con l'unica possibile essere la correzione:

(y.lines).toList(b).apply(ls.head) 

io non sono sicuro che Scala avrebbe deciso in questo caso particolare.

La regola, in parole povere, è object (method parameters)* [method]. Il compilatore continuerà finché trova token per un'espressione valida. A ; termina l'espressione e lo stesso vale per ) o }. Se la riga successiva è vuota, termina anche l'espressione. Se la riga successiva inizia con una parola chiave riservata (val, def, if, ecc.), Anche l'espressione terminerà.

Problemi correlati