方法与函数:意外的单位返回值

时间:2014-06-02 21:44:54

标签: scala methods

为什么当等效函数返回一个布尔值(如预期的那样)时,下面的方法会返回一个单位值(即())?

// aMethod(1) returns ()
def aMethod(a: Int) { true }

// aFunction(1) returns true
val aFunction = (a: Int) => true

3 个答案:

答案 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"