Frage

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

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

scala> T m 0
res19: Boolean = true

Aber warum kann ich nicht lasse 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
         ^
War es hilfreich?

Lösung

Das ehemalige Beispiel T m 0, ist ein Beispiel für "Operator Notation". Scala hat drei Arten von Operator-Notationen, prefix (genannt unären), Infix und Postfix. Lassen Sie uns Beispiele für alle drei in Aktion sehen hier:

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 jede gültige Scala Kennung akzeptieren, wenn die Rede Postfixnotation der Einschränkung ist, nur vier Bezeichner als Präfix verwendet werden können:. ~,, - und +

Wenn Sie nun „m 0“ versuchen, Scala verwirft es ein unärer Operator ist, auf dem Gelände der keine gültige ein Wesen (~, - und +). Es stellt fest, dass „m“ ist ein gültiges Objekt -. Es ist eine Funktion, keine Methode, und alle Funktionen sind Objekte

Als „0“ keine gültige Scala-Kennung ist, kann es weder ein Infix noch ein Postfix-Operator sein. Deshalb klagt Scala, dass es erwartet „;“ - das würde trennen zwei (fast) gültige Ausdrücke: „m“ und „0“. Wenn Sie es eingeführt wird, dann würde es beklagen, dass m erfordert entweder ein Argument, oder andernfalls ein „_“, um sich in eine teilweise angewandten Funktion.

Andere Tipps

Ich glaube, dass der Operator Syntax Stil funktioniert nur, wenn Sie ein explizites Objekt auf der linke Seite hat. Die Syntax soll, lassen Sie „Operand Operator Operand“ -Stil Operationen auf natürliche Weise auszudrücken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top