Domanda

In Scala, perché posso omettere il punto e le parentesi in T m 0 (anziché T.m (0) ) nel seguente?

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

scala> T m 0
res19: Boolean = true

Ma perché non posso omettere le staffe in n (0) nel seguito?

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

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

Soluzione

Il primo esempio, T m 0, è un esempio di "notazione operatore". Scala ha tre tipi di notazioni operatore, prefisso (chiamato unario), infisso e postfisso. Vediamo esempi di tutti e tre in azione qui:

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
}

Un qui è in uso:

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

Mentre le notazioni infix e postfix accettano qualsiasi identificatore Scala valido, sebbene si parli di limitare la notazione postfix, solo quattro identificatori possono essere usati come prefisso: ~,!, - e +.

Ora, quando provi " m 0 " ;, Scala lo scarta come un operatore unario, per il motivo di non essere valido (~,!, - e +). Rileva che " m " è un oggetto valido: è una funzione, non un metodo e tutte le funzioni sono oggetti.

Come " 0 " non è un identificatore Scala valido, non può essere né un operatore infix né un postfix. Pertanto, Scala si lamenta che si aspettava "quot"; - che separerebbe due espressioni (quasi) valide: " m " e "0". Se lo inserissi, si lamenterebbe che m richiede un argomento o, in mancanza, un " _ " per trasformarlo in una funzione parzialmente applicata.

Altri suggerimenti

Credo che lo stile della sintassi dell'operatore funzioni solo quando hai un oggetto esplicito sul lato sinistro. La sintassi ha lo scopo di farti esprimere "operando operatore operando" operazioni di stile in modo naturale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top