我知道你可以創建一個匿名函數,並讓編譯器推斷它的返回類型:是否可以在Scala中指定一個匿名函數的返回類型?
val x =() => { System.currentTimeMillis }
只爲靜態類型的緣故,是不是可以指定它的返回類型呢?我認爲這會讓事情變得更清楚。
我知道你可以創建一個匿名函數,並讓編譯器推斷它的返回類型:是否可以在Scala中指定一個匿名函數的返回類型?
val x =() => { System.currentTimeMillis }
只爲靜態類型的緣故,是不是可以指定它的返回類型呢?我認爲這會讓事情變得更清楚。
在我看來,如果你想使事情變得更加清晰最好是通過添加類型註釋存在,而不是函數的結果是記錄這個標識符x的期望。
val x:() => Long =() => System.currentTimeMillis
然後編譯器將確保右邊的函數滿足這個期望。
val x =() => { System.currentTimeMillis } : Long
這解決了我的問題。這使得比使用函數#方法少得多。 – 2010-09-29 23:28:07
看起來像'val x =()=> Long = {blah}'是一種更直觀的語法。感謝你的回答! – wbarksdale 2012-09-26 18:49:51
的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下降,則無關緊要,只有它是否適用。
不確定你的意思是*左邊的函數符合期望值*,設置結果塊的類型也確保了類型是正確的,例如, 'val x =()=> {System.currentTimeMillis}:String'不能編譯。或者你的意思是別的嗎? – 2010-01-18 19:27:39
傑夫的答案有一個好處,就是您可以預先獲得完整類型。如果你有一個很長的(多行)函數定義,那麼如果這個類型在開始的時候,它是理解最快的。 Fabian的答案具有重複性較低的優點(尤其適用於簡短的(單行)定義,並且可以更快地理解您是否可以一眼看出整個事物)。 – 2010-01-18 19:41:11
哦,現在我看到Geoff的觀點,他的類型定義包含了輸入類型,這裏是'()',並且當函數'()=> System.currentTimeMillis'被賦值給'x'時被檢查。 – 2010-01-18 19:46:15