2009-06-17 6 views
22

In Scala, warum kann ich lasse den Punkt und brakets in T m 0 (statt T.m(0)) in den folgenden?Welche Zeichen kann ich in Scala weglassen?

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

scala> T m 0 
res19: Boolean = true 

Aber warum kann ich weglassen nicht die brakets in n(0) in der folgenden?

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

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

Antwort

36

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.

+0

Sie keine Listen verwenden ::: und :: als Präfixnotation? – andychase

+1

@ 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. –

3

Ich glaube, der Operator-Syntax-Stil funktioniert nur, wenn Sie ein explizites Objekt auf der linken Seite haben. Die Syntax soll es Ihnen ermöglichen, Operandenoperand-Stiloperationen auf natürliche Weise auszudrücken.

+1

Ich weiß nicht, was Sie mit expliziten Objekt meinen, aber Sie können so ziemlich alles haben, was zu einem Objekt auf Ihrer linken Seite auswertet, oder? (... links?) –