我最近玩的是一段代码,它严重依赖于函数参数,并注意到以下行为,我无法向自己解释:
// first, a few methods
def a(x: => Any) {}
def b(x:() => Any) {}
// then some helpers
def x = {}
def y() = {}
// these execute the possible combinations
a(x)
b(y)
a(y)
b(x)
前三个按预期工作,但第四个失败。它的REPL输出是
<console>:10: error: type mismatch;
found : Unit
required: () => Any
b(x)
^
对我来说x
和y
看起来一样,但显然不是。起初我认为它是某种属性访问而不是被引用的方法,但我无法推断,因为a(y)
似乎工作得很好 - 换句话说,我看不到操作之间的对称性
那么,我错过了什么?
答案 0 :(得分:2)
它们与往常不同(令人讨厌,我知道)编译器是对的。
def a(x: => Any)
- 按名称<{1}} 按名称的函数,其中x
为x
并返回单位,因此完整定义将是:Any
。
def a(x: => Any) : Unit
- 使用参数def b(x: () => Any)
按值的函数,其中x
是函数x
。
() => Any
相当于def x = {}
def x : Unit = {}
相当于def y() = {}
(这是一个函数,没有参数,即def y(): Unit = {}
,映射到()
,即Unit
)。
因此,第四个失败,因为Any
不是将参数映射到x
的函数,它只是一个返回Any
的属性。