Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 方法vs函数:意外的单元返回值_Scala_Methods - Fatal编程技术网

Scala 方法vs函数:意外的单元返回值

Scala 方法vs函数:意外的单元返回值,scala,methods,Scala,Methods,当等效函数返回布尔值(如预期)时,为什么下面的方法返回单位值(即()) 让我们向方法中添加显式返回类型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

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


让我们向方法中添加显式返回类型
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
}
现在,我们的方法返回一个
布尔值
,而不是
单位

def aMethod(a: Int) = {
  true
}
因此,您的问题是
return
的滥用和不适当的方法语法。如果方法声明中没有
=
,则假定返回类型为
单位

def aMethod(a: Int) = {
  true
}
让我们进一步整理您的代码:

object X {
  def aMethod(a: Int) = true

  val aFunction = (a: Int) => true

  def test(f: Int => Any) = (1 to 5) map f foreach println
}
我已经删除了
返回值
——我写了一篇关于为什么不应该使用它的文章。我已经去掉了多余的花括号


我还将您的
for
循环更改为更像Scala的理解。

为了清晰起见,我将添加以下内容:

def aMethod(a: Int) {
  true
}
这将返回
单位

def aMethod(a: Int) = {
  true
}
这将返回
布尔值
。(由编译器推断)


问题是,必须在方法签名后有一个
=
,才能使它返回与
单元不同的内容。当您有一个
=
时,编译器将根据方法体中的最后一个表达式推断返回类型。

首先,让我们像@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扩展”,它将
X.test(X.aMethod)
转换为
X.test(i=>X.aMethod(i))
。因此,参数仍然是一个“函数”

更新:


您可以通过将代码放入“try.scala”并运行“scala-Xprint:type try.scala”来证实这一点。

您不需要使用任何
return
s或花括号-它们只会给代码添加噪音。嘿!谢谢你的反馈:-)这个样本比严格意义上的需要要混乱一点,因为我同时写了一些关于回报的调查结果,等等。但是我想知道的不是如何使它工作或者如何使它更漂亮,而是在引擎盖下发生了什么来解释这种行为:-S还有,那不是“Scala喜欢”吗“语法需要中间记忆吗?”丹尼尔我解释了引擎盖下发生的事情。由于语法不正确,您的方法的类型为
Unit
。你所说的中间存储器是什么意思?我认为在这种情况下,可读性胜过任何微小的内存优势。Ok发现了这个问题。我对你的答案投了赞成票,因为它具有宝贵的见解,但为了清晰起见,我将在下面添加我一直在寻找的答案。