为什么当等效函数返回一个布尔值(如预期的那样)时,下面的方法会返回一个单位值(即()
)?
// aMethod(1) returns ()
def aMethod(a: Int) { true }
// aFunction(1) returns true
val aFunction = (a: Int) => true
答案 0 :(得分:6)
为了清楚起见,我将添加此内容:
def aMethod(a: Int) {
true
}
返回Unit
。
def aMethod(a: Int) = {
true
}
返回Boolean
。 (由编译器推断)
问题是,在您的方法签名后,必须一个=
,以使其返回与Unit
不同的内容。如果有=
,则返回类型将由编译器推断,具体取决于方法体中的最后一个表达式。
答案 1 :(得分:5)
让我们为您的方法添加Boolean
的显式返回类型:
def aMethod(a: Int): Boolean
{
return true
}
现在我们遇到编译错误:
Error:(120, 5) illegal start of declaration (possible cause: missing `=' in front of current method body)
return true
^
哎呀,让我们尝试做它说的话:
def aMethod(a: Int): Boolean =
{
return true
}
现在我们的方法返回Boolean
而不是Unit
。
因此,您的问题是滥用return
和不恰当的方法语法。如果方法声明中没有=
,则假定返回类型为Unit
。
让您的代码更整洁:
object X {
def aMethod(a: Int) = true
val aFunction = (a: Int) => true
def test(f: Int => Any) = (1 to 5) map f foreach println
}
我删除了return
- 我写了another answer on SO,为什么你不应该使用它。我删除了多余的花括号。
我还将你的for
循环更改为更像Scala的理解。
答案 2 :(得分:2)
首先,让@Boris整理您的代码。
object X {
def aMethod(a: Int) = true
val aFunction = (a: Int) => true
def test(f: Int => Any) = (1 to 5) map f foreach println
}
X.test(X.aFunction)
X.test(X.aMethod)
在scala中,方法和功能是不同的概念。方法就像java方法一样,它属于一个类,可以有泛型类型。但是,函数是scala中Function
类的实例,因此它是一个对象。
我们可以使用"功能"作为方法参数,因为它是一个对象,但我们不能使用"方法"做同样的事情。
X.test(X.aMethod)
发生了什么" eta-expansion",它将X.test(X.aMethod)
转换为X.test(i => X.aMethod(i))
。所以参数仍然是"功能"。
更新:
您可以通过将代码放入" try.scala"来证实这一点。并运行" scala -Xprint:输入try.scala"