L'esempio precedente, T m 0, è un esempio di "notazione dell'operatore". Scala ha tre tipi di notazioni operatore, prefisso (chiamato unario), infisso e suffisso. Vediamo alcuni 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
}
Una 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 infissa e Postfix notazioni accettano qualsiasi identificatore Scala valida, anche se si parla di limitare la notazione postfix , solo quattro identificatori possono essere usati come prefisso: ~,!, - e +.
Ora, quando si prova "m 0", Scala lo ignora essendo un operatore unario, in quanto non valido (~,!, - e +). Trova che "m" è un oggetto valido: è una funzione, non un metodo, e tutte le funzioni sono oggetti.
Poiché "0" non è un identificatore Scala valido, non può essere né un operatore infisso né un operatore postfisso. Pertanto, Scala si lamenta che si aspettava ";" - che separerebbe due espressioni (quasi) valide: "m" e "0". Se lo hai inserito, allora si lamenterebbe che m richiede un argomento o, in mancanza, un "_" per trasformarlo in una funzione parzialmente applicata.
fonte
2009-06-18 20:19:31
Le liste non usano ::: e :: come notazione prefisso? – andychase
@ asperous.us No. Gli operatori che terminano in ':' hanno una diversa [fissità] (http://en.wikipedia.org/wiki/Operator_associativity): sono _right associative_ invece di _left associative_, ma sono operatori infissi lo stesso. –