繁体   English   中英

在内联执行它们之前,将Scala lambda表达式包装在块中(使用大括号和括号)有什么作用?

[英]What does wrapping Scala lambda expressions in blocks (using both braces and parentheses) before executing them inline achieve?

在阅读有关monads的文章时 ,我注意到作者使用括号将自己的lambda包装成块:

def foo(bar: String) = {
  ({ () => println(bar) })()
  ({ () => bar.length })()
}

这与仅使用一对括号有何不同? (这在语法上确实有意义。)

我在解释器中尝试了两种形式,它们都是正确的:

scala> ({ () => println(123) })()
123

scala> ( () => println(123) )()
123

我的第一个猜测是,它与作用域规则有关-但是,lambda并没有名称,因此它们不会对命名空间产生太大影响。

它绝对不做任何事情。 解析器将忽略多余的大括号。

编译这段代码:

object Test {
  def x = ({ () => println(123) })()
  def y = ( () => println(123) )()
}

使用-Xprint:parser ,中间结果是:

[[syntax trees at end of                    parser]]
package <empty> {
  object Test extends scala.AnyRef {
    def <init>() = {
      super.<init>();
      ()
    };
    def x = (() => println(123))();
    def y = (() => println(123))()
  }
}

xy导致相同的抽象语法树。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM