2010-01-18 103 views

回答

27

在我看來,如果你想使事情變得更加清晰最好是通過添加類型註釋存在,而不是函數的結果是記錄這個標識符x的期望。

val x:() => Long =() => System.currentTimeMillis

然後編譯器將確保右邊的函數滿足這個期望。

+0

不確定你的意思是*左邊的函數符合期望值*,設置結果塊的類型也確保了類型是正確的,例如, 'val x =()=> {System.currentTimeMillis}:String'不能編譯。或者你的意思是別的嗎? – 2010-01-18 19:27:39

+0

傑夫的答案有一個好處,就是您可以預先獲得完整類型。如果你有一個很長的(多行)函數定義,那麼如果這個類型在開始的時候,它是理解最快的。 Fabian的答案具有重複性較低的優點(尤其適用於簡短的(單行)定義,並且可以更快地理解您是否可以一眼看出整個事物)。 – 2010-01-18 19:41:11

+0

哦,現在我看到Geoff的觀點,他的類型定義包含了輸入類型,這裏是'()',並且當函數'()=> System.currentTimeMillis'被賦值給'x'時被檢查。 – 2010-01-18 19:46:15

37
val x =() => { System.currentTimeMillis } : Long 
+0

這解決了我的問題。這使得比使用函數#方法少得多。 – 2010-09-29 23:28:07

+0

看起來像'val x =()=> Long = {blah}'是一種更直觀的語法。感謝你的回答! – wbarksdale 2012-09-26 18:49:51

9

的Fabian給了直截了當的方式,但如果你的一些其他的方法一樣事無鉅細糖包括:

val x = new (() => Long) { 
    def apply() = System.currentTimeMillis 
} 

val x = new Function0[Long] { 
    def apply() = System.currentTimeMillis 
} 

甚至

val x = new { 
    def apply(): Long = System.currentTimeMillis 
} 
因爲

大多數情況下,它如果它從Function下降,則無關緊要,只有它是否適用。

相關問題