2009-08-05 17 views
9

yo estaba pasando por el maravilloso libro Programming in Scala cuando me encontré con un pedazo de código que simplemente no tiene sentido para mí:sintaxis con punto Scala (o falta de ella)

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

Nota línea 2 y 3:

val this1 = this widen that.width 

parece como si tuviera que ser capaz de reemplazar esto con:

val this1 = this.widen that.width 

Sin embargo, cuando intento compilar este cambio, se da el siguiente error:

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

¿Por qué es esta sintaxis inaceptable?

+1

Posibles duplicados: http://stackoverflow.com/questions/1181533/what-are-the-precise-rules-for-when-you-can-omit-parenthesis-dots-braces-fu and http: // stackoverflow.com/questions/1006967/scala-which-characters-can-i-omit –

Respuesta

17

Línea 2 utiliza el método widen como operador, en lugar de usarlo como un método en el camino de Java:

val this1 = this.widen(that.width) 

El error se produce porque se ha dejado fuera de los paréntesis, que sólo se puede hacer cuando usas un método en notación de operador. Usted no puede hacer esto por ejemplo:

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

su lugar debe escribir

"a".+ ("b") 

En realidad se puede hacer esto con números enteros, pero eso es más allá del alcance de esta pregunta.

Leer más:

  • Capítulo 5 del artículo 3 de su libro es acerca de la notación de operadores, al menos en la primera edición, versión 5
  • A Tour of Scala: Operators
3

no lo han intentado, pero tal vez esto funciona: val this1 = this.widen(that.width)

widen es probablemente un método que tenga un parámetro (además de la referencia this), estos métodos pueden ser usados ​​como operadores como en su primer código de ejemplo.

2

Cuando se utiliza un punto está usando estilo de punto para invocación de método. Cuando no lo hace, está utilizando el estilo de operador. No puede mezclar ambas sintaxis para la misma invocación de método, aunque puede mezclar las dos para diferentes invocaciones, como that.width usado como parámetro en la invocación de estilo de operador de widen.

Consulte Which characters can I omit in Scala? o What are the precise rules for when you can omit parenthesis, dots, braces, = (functions), etc.?.

Cuestiones relacionadas