2009-08-05 20 views
9

stavo attraversando il bellissimo libro Programming in Scala quando mi sono imbattuto in un pezzo di codice che proprio non ha senso per me:sintassi del punto Scala (o mancanza)

def above(that: Element): Element = { 
    val this1 = this widen that.width 
    val that1 = that widen this.width 
    elem(this1.contents ++ that1.contents) 
} 

nota linea 2 e 3:

val this1 = this widen that.width 

sembra che dovrei essere in grado di sostituire questo con:

val this1 = this.widen that.width 
.210

Tuttavia, quando provo a compilare questo cambiamento, dà il seguente errore:

error: ';' expected but '.' found.
val this1 = this.widen that.width ^

Perché questa sintassi accettabile?

+1

Possibili duplicati: http://stackoverflow.com/questions/1181533/che cosa-are-il-precise-rules-for-when-you-can-omit-parenthesis-dots-braces-fu e http: // stackoverflow.com/questions/1006967/scala-which-characters-can-i-omit –

risposta

17

Linea 2 utilizza il metodo widen come operatore, invece di usarlo come metodo nel modo Java:

val this1 = this.widen(that.width) 

L'errore si verifica perché hai lasciato fuori le parentesi, che si può fare solo quando si utilizza un metodo nella notazione dell'operatore. È Non può fare questo ad esempio:

"a".+ "b" // error: ';' expected but string literal found. 

Invece si dovrebbe scrivere

"a".+ ("b") 

In realtà si può fare questo con gli interi, ma questo è oltre la portata di questa domanda.

Per saperne di più:

  • Capitolo 5 sezione 3 del vostro libro è circa la notazione dell'operatore, almeno nella prima edizione, la versione 5
  • A Tour of Scala: Operators
3

non l'ho provato, ma forse questo funziona: val this1 = this.widen(that.width)

widen è probabilmente un metodo di prendere un parametro (più il riferimento this), tali metodi possono essere usati come operatori, come nel codice primo campione.

2

Quando si utilizza un punto stai usando dot-style per il richiamo del metodo. Quando non lo fai, stai usando lo stile operatore. Non è possibile combinare entrambe le sintassi per la stessa invocazione di metodo, sebbene sia possibile combinare le due per invocazioni diverse, ad esempio quella utilizzata come parametro nell'invocazione dello stile operatore di widen.

Si prega di fare riferimento a Which characters can I omit in Scala? o What are the precise rules for when you can omit parenthesis, dots, braces, = (functions), etc.?.

Problemi correlati