使用函数参数时,括号的显着差异是什么

时间:2013-05-27 06:32:39

标签: scala

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

// 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)似乎工作得很好 - 换句话说,我看不到操作之间的对称性

那么,我错过了什么?

1 个答案:

答案 0 :(得分:2)

它们与往常不同(令人讨厌,我知道)编译器是对的。

def a(x: => Any) - 按名称<{1}} 按名称的函数,其中xx并返回单位,因此完整定义将是: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的属性。