2009-08-05 10 views
9

szedłem wspaniałej książki Programming in Scala kiedy natknąłem się na fragment kodu, które po prostu nie ma sensu do mnie:Scala kropka składnia (lub jej brak)

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

linii 2 i Note 3:

val this1 = this widen that.width 

wydaje się, że powinienem być w stanie zastąpić ten z:

val this1 = this.widen that.width 

Jednak gdy próbuję skompilować tę zmianę, to daje następujący błąd:

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

Dlaczego ta składnia do zaakceptowania?

+1

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

Odpowiedz

17

Linia 2 stosuje metodę widen jako operator, zamiast używać go jako metody w sposób Java:

val this1 = this.widen(that.width) 

Błąd występuje dlatego, że pominięte nawiasy, które można zrobić tylko gdy używasz metody w notacji operatora. Ci nie Można to zrobić na przykład:

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

Zamiast tego trzeba napisać

"a".+ ("b") 

Właściwie można to zrobić za pomocą liczb całkowitych, ale to wykracza poza zakres tego pytania.

Więcej:

3

nie próbowałem go, ale być może to działa: val this1 = this.widen(that.width)

widen prawdopodobnie jest metoda przyjmuje jeden parametr (plus odniesienie this), takie metody mogą być wykorzystywane jak operatorzy jak w pierwszym przykładowym kodem.

2

Podczas korzystania kropkę używasz stylu kropki do wywoływania metody. Kiedy tego nie robisz, używasz stylu operatora. Nie można łączyć obu składni dla tego samego wywołania metody, ale można mieszać te dwie wartości dla różnych wywołań - takich jak ta. Szerokość używana jako parametr w wywołaniu stylu operatora w rozszerzeniu.

Proszę zapoznać się z Which characters can I omit in Scala? lub What are the precise rules for when you can omit parenthesis, dots, braces, = (functions), etc.?.