2009-08-05 8 views
9

Je traversais le merveilleux livre Programming in Scala quand je suis tombé sur un morceau de code qui vient n'a pas de sens pour moi:Scala syntaxe de point (ou son absence)

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

Remarque la ligne 2 et 3:

val this1 = this widen that.width 

Il semble que je devrais pouvoir le remplacer par:

val this1 = this.widen that.width 

Cependant, lorsque je tente de compiler ce changement, il donne l'erreur suivante:

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

Pourquoi cette syntaxe inacceptable?

+1

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

Répondre

17

Ligne 2 utilise la méthode widen comme un opérateur, au lieu d'utiliser comme méthode de la manière Java:

val this1 = this.widen(that.width) 

L'erreur se produit parce que vous avez laissé les parenthèses, que vous ne pouvez faire lorsque vous utilisez une méthode dans la notation de l'opérateur. Vous ne pouvez pas faire par exemple:

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

Au lieu de cela, vous devriez écrire

"a".+ ("b") 

En fait, vous pouvez le faire avec des entiers, mais c'est au-delà de la portée de cette question.

En savoir plus:

  • Chapitre 5 section 3 de votre livre est au sujet de la notation de l'opérateur, au moins dans la première édition, la version 5
  • A Tour of Scala: Operators
3

Je n'ai pas essayé mais peut-être cela fonctionne: val this1 = this.widen(that.width)

widen est probablement une méthode prenant un paramètre (plus la référence this), ces méthodes peuvent être utilisées comme opérateurs dans votre premier exemple de code.

2

Lorsque vous utilisez un point vous utilisez un point-style pour l'appel de méthode. Lorsque vous ne le faites pas, vous utilisez le style opérateur. Vous ne pouvez pas mélanger les deux syntaxes pour la même invocation de méthode, bien que vous puissiez mélanger les deux pour des invocations différentes - par exemple that.width utilisé en tant que paramètre dans l'invocation du style d'opérateur de widen.

Veuillez vous référer à Which characters can I omit in Scala? ou What are the precise rules for when you can omit parenthesis, dots, braces, = (functions), etc.?.

Questions connexes