2012-09-11 55 views
3

我已經想到,爲了創建對象的前綴方法,我可以在方法名的末尾使用:,因此,我寫道:ScalaIDE - 以冒號結尾的方法的奇怪

def aaa: { 
} 

它編譯得很好!然而,這是沒有用的,所以我想讓這個方法返回一些東西,所以,不確定,我寫道:

def aaa: = { 
} 

錯誤!

- identifier expected but '=' found. 
- not found: type <error> 

好吧,我明白,在: =編譯器斷裂,我變得好奇,我嘗試:

def aaa: { 
    println("wow") 
} 

錯誤了!

illegal start of declaration (possible cause: missing `=' in front of current method body) 

那我試試這個:

val a = aaa 

和它說(懸停在aaa),其aaa簽名def aaa: AnyRef,所以我嘗試:

def aaa: { 
    Global 
} 

其中Globalobject。仍然錯誤。所以,我的問題是:爲什麼這個語法被允許?我不能使它像前綴方法一樣工作,我不能使用這種方法的副作用,我不能讓它返回任何東西。爲什麼它首先允許我這樣寫?

UPDATE:

我現在試試這個:

def aaa: {} = { 
    Global 
} 

和它的作品。所以看起來像{}表示AnyRef。開始感覺像我在JavaScript的仙境。

回答

8

你會得到這些錯誤,因爲方法名末尾的冒號意味着你想指定一個返回類型。如果你沒有給出,編譯器會抱怨。與{}它的作品,因爲你給一個類型,在這種情況下,一個空的結構類型,這基本上是相同的AnyRef。有一些規則,當您實際允許在方法名稱末尾添加冒號時,afaik方法只能由非字母數字字符組成。所以def +:(x:Int)沒問題,def foo:(x:Int)導致錯誤。但我不確定這件事。以冒號結尾的方法也是右聯合的。

+7

'def foo_:(x:Int)'會沒事的。您必須用'_'來分隔標識符中的字母數字和運算符。 – Debilski

+0

很酷,謝謝! – drexin