任何人都可以提供關於如何通過Scala編譯器將名稱參數=> T
和Function0
參數() => T
轉換爲另一個的權威答案嗎?我知道它們並不相同,但差別非常微小,因爲它們可以在許多場景中互換使用。Scala:函數0與名稱參數
示例:如果我定義
def someFunction: Int = 2
def f(x: => Int): Unit = println(x)
然後我可以成功地調用
f(2)
f(someFunction)
如何是() => Int
用於=> Int
可接受的置換?
更一般地說,() => T
是一個普遍接受的替代名稱爲=> T
的參數嗎?
另外,請糾正我,如果我錯了以下的理由:=> T
是從不爲() => T
可接受的替代,因爲第一個是值類型(T
),另一種是功能型。也就是說,如果我有def f(x:() => Int)
,我將永遠無法通過Int
或懶惰Int
(因爲沒有懶惰類型,所以甚至沒有意義)。
你的例子絕對*不*等價。第一個產生一個'Try [()⇒Int]',第二個'Try [Int]'。 '()⇒Int'的函數參數被轉換爲'⇒T',其中'T'爲'()⇒Int'。 –
這裏有一些很好的信息:https://tpolecat.github.io/2014/06/26/call-by-name.html – nevets1219
它們不會相互替換,它們也不會被Scala編譯器轉換爲另一個。它們只是不同的東西,通常用於不同的目的。 –