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ę.
Czy listy nie używają ::: i :: jako notacji przedrostkowej? – andychase
@ 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. –