Erstere Beispiel T m 0 ist, ist ein Beispiel für "-Operator notation". Scala hat drei Arten von Operator-Notationen: Präfix (unary), Infix und Postfix.
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
}
Ein hier ist es im Einsatz:
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
Während Infix und Postfix-Notationen akzeptieren jede gültige Scala Kennung, obwohl die Rede Postfixnotation der Beschränkung ist hier Lassen Sie uns Beispiele für alle drei in Aktion , können nur vier Bezeichner als Präfix verwendet werden: ~,!, - und +.
Nun, wenn Sie „m 0“ versuchen, Scala verwirft es ein unärer Operator ist, auf dem Gelände der keinen gültigen ein Wesen (~, - und +). Es stellt fest, dass „m“ ein gültiges Objekt ist - es ist eine Funktion ist, kein Verfahren, und alle Funktionen sind Objekte.
Da "0" kein gültiger Scala-Bezeichner ist, kann es weder ein Infix- noch ein Postfix-Operator sein. Deshalb beklagt sich Scala, dass es erwartet ";" - was zwei (fast) gültige Ausdrücke trennen würde: "m" und "0". Wenn Sie es eingeführt ist, dann wäre es beklagen, dass m erfordert entweder ein Argument, oder andernfalls ein „_“, um sich in eine teilweise angewandten Funktion.
Sie keine Listen verwenden ::: und :: als Präfixnotation? – andychase
@ asperous.us Nein. Operatoren, die auf ':' enden, haben eine andere [Fixität] (http://en.wikipedia.org/wiki/Operator_associativity): Sie sind _right assoziativ_ anstatt _links assoziativ_, aber sie sind Infixoperatoren alles das selbe. –