1

我最近在玩一段严重依赖函数参数的代码,并注意到以下我无法向自己解释的行为:

// 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)
                ^

对我来说xy看起来一样,但显然不是。起初我认为这是某种属性访问而不是被引用的方法,但我无法推断出它a(y)似乎工作得很好——换句话说,我看不到操作之间的对称性。

那么,我错过了什么?

4

1 回答 1

2

它们完全不同,并且像往常一样(很烦人,我知道)编译器是正确的。

def a(x: => Any)x -按名称接受参数的函数where xisAny并返回单位,因此完整定义为: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,它只是一个返回的属性Unit

于 2013-05-27T06:44:30.917 回答