具有匿名功能的println不打印预期值

时间:2014-06-16 10:15:02

标签: scala

我想知道Scala匿名函数。

object hello { 
  def main(args: Array[String]) { 
    println ( ( (x:Int)=>return x+1)(1) ) 
  } 
}

我预计结果为'2'但输出为空白。我的假设错了吗?

2 个答案:

答案 0 :(得分:3)

我没有得到一个空白,因为你引发了结果,但是出现以下编译错误:

scala> println ( ( (x:Int)=> return x+1)(1) )
<console>:8: error: return outside method definition
              println ( ( (x:Int)=> return x+1)(1) )

删除return关键字,除了以外在Scala中通常无用:

scala> println ( ( (x:Int)=>x+1)(1) )
2

确实, return只能从方法(使用def定义)返回。
您的函数文字调用未包含在方法体中,这就是您遇到此错误的原因。

为了说明,此代码段有效:

scala> def wrappingMethod(): Int = {  //note this enclosing method
  ((x:Int)=> return x+1)(1)           // it's valid to call return here
}
     |      | wrappingMethod: ()Int

scala> wrappingMethod()
res3: Int = 2

答案 1 :(得分:2)

lambda的结果是lambda体中最后一个语句的结果,所以你可以添加结果值(在本例中为literal())作为最后一行。

lambda中的return将从周围的方法返回,而不是使用异常(NonLocalReturnControl)从lambda本身返回。

在您的情况下,您的返回将返回一个单位。

有效代码如下:

println ( ( (x:Int)=> x+1)(1) )