2009-06-17 14 views
22

W Scala, dlaczego mogę pominąć kropkę i hamki w T m 0 (zamiast T.m(0)) w następujących przypadkach?Które postacie można pominąć w Scali?

scala> object T { def m(i:Int) = 0 == i } 
defined module T 

scala> T m 0 
res19: Boolean = true 

Ale dlaczego nie mogę pominąć brakets w n(0) w następujących?

scala> def n(i:Int) = 0 == i 
n: (Int)Boolean 

scala> n 0 
<console>:1: error: ';' expected but integer literal found. 
     n 0 
     ^

Odpowiedz

36

Poprzedni przykład, T m 0, jest przykładem "notacji operatora". Scala ma trzy typy notacji operatora, przedrostek (nazywany unarnym), infiks i postfiks. Zobaczmy przykłady wszystkich trzech w akcji tutaj:

class MyByte(val n : Int) { 
    require(n >= 0 && n <= 255) 
    def unary_! = new MyByte(n^0xff) 
    def +(m : MyByte) = new MyByte(n + m.n) 
    def bits = (math.log(n)/math.log(2) + 1).toInt 
    override def toString = "0" * (8 - bits) + n.toBinaryString 
} 

tutaj jest w użytku:

scala> val a = new MyByte(5) 
a: MyByte = 00000101 

scala> val b = new MyByte(10) 
b: MyByte = 00001010 

scala> ! a // Prefix/Unary 
res58: MyByte = 11111010 

scala> a + b // Infix 
res59: MyByte = 00001111 

scala> b bits // Postfix 
res60: Int = 4 

Podczas Infix i Postfix oznaczenia przyjąć dowolny prawidłowy identyfikator Scala, choć mówi się o ograniczeniu notacji postfix , tylko cztery identyfikatory mogą być użyte jako prefiks: ~,!, - i +.

Teraz, gdy spróbujesz "m 0", Scala odrzuci to jako operator jednoargumentowy, ponieważ nie jest ważny (~,!, - i +). Stwierdza, że ​​"m" jest prawidłowym obiektem - jest funkcją, a nie metodą, a wszystkie funkcje są obiektami.

Ponieważ "0" nie jest poprawnym identyfikatorem Scala, nie może to być ani infiks, ani operator postfiksu. Dlatego Scala narzeka, że ​​spodziewał się ";" - który oddzieliłby dwa (prawie) prawidłowe wyrażenia: "m" i "0". Jeśli wstawiłeś to, to narzekałoby, że m wymaga albo argumentu, albo, jeśli nie, "_", aby przekształcić go w częściowo zastosowaną funkcję.

+0

Czy listy nie używają ::: i :: jako notacji przedrostkowej? – andychase

+1

@ asperous.us Nr Operatory, które kończą się na ':' mają inną [stałość] (http://en.wikipedia.org/wiki/Operator_associativity): są _right associative_ zamiast _left associative_, ale są operatorami infiksów wszystkie takie same. –

3

Wierzę, że styl składni operatora działa tylko wtedy, gdy masz wyraźny obiekt po lewej stronie. Składnia ma na celu umożliwienie wyrażenia "operacji operandu operatora operandu" w naturalny sposób.

+1

Nie wiem, co masz na myśli przez obiekt jawny, ale możesz mieć prawie wszystko, co ocenia obiekt po lewej stronie, prawda? (... po lewej?) –