任何人都可以提供关于如何通过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编译器转换为另一个。它们只是不同的东西,通常用于不同的目的。 –