2009-06-17 66 views
22

在斯卡拉,爲什麼我可以省略T m 0(而不是T.m(0))中的點和制動器?我可以在Scala中忽略哪些字符?

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

scala> T m 0 
res19: Boolean = true 

但是爲什麼我不能在下面省略n(0)的制動器?

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

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

回答

36

前面的示例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需要一個參數,或者如果失敗了,就用一個「_」把它變成一個部分應用的函數。

+0

不要列出使用:::和::作爲前綴符號嗎? – andychase 2013-04-12 21:57:14

3

我相信操作符語法樣式只有在左側有明確的對象時才起作用。該語法旨在讓您以自然的方式表達「操作數運算符」樣式操作。

+1

我不明白你是什麼意思的顯式對象,但你可以有幾乎任何東西評估左側的對象,對不對? (...離開?) – 2009-08-05 23:01:11

相關問題