前面的示例T m 0是「操作符表示法」的一個示例。 Scala有三種運算符符號,前綴(稱爲一元),中綴和後綴。讓我們來看看這三個例子在這裏的行動:
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
}
一個在這裏它是在使用中:
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
雖然綴和後綴符號接受任何有效的Scala的標識符,雖然有限制後綴符號的通話,只能使用四個標識符作爲前綴:〜,!, - 和+。現在,當你嘗試「m 0」時,Scala放棄它作爲一元操作符,理由是它不是有效的(〜,!, - 和+)。它發現「m」是一個有效的對象 - 它是一個函數,而不是一個方法,所有的函數都是對象。
由於「0」不是有效的Scala標識符,它不能既不是中綴也不是後綴運算符。因此,斯卡拉抱怨說它預計「;」 - 這將分隔兩個(幾乎)有效的表達式:「m」和「0」。如果你插入它,那麼它會抱怨m需要一個參數,或者如果失敗了,就用一個「_」把它變成一個部分應用的函數。
不要列出使用:::和::作爲前綴符號嗎? – andychase 2013-04-12 21:57:14