在内联执行Scala lambda表达式之前,将其包装在块中(使用大括号和圆括号)能实现什么?

在内联执行Scala lambda表达式之前,将其包装在块中(使用大括号和圆括号)能实现什么?,scala,lambda,Scala,Lambda,在阅读monads上的一篇文章时,我注意到作者用大括号将他的lambda包成了块: def foo(bar: String) = { ({ () => println(bar) })() ({ () => bar.length })() } 这与仅仅使用一对括号有什么不同?(这在语法上是有意义的。) 我在翻译中尝试了这两种形式,它们都是正确的: scala> ({ () => println(123) })() 123 scala> ( () =>

在阅读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))()
  }
}
[[解析器末尾的语法树]]
包装{
对象测试扩展了scala.AnyRef{
def()={
超级(;
()
};
defx=(()=>println(123))();
定义y=(()=>println(123))()
}
}

x
y
产生相同的抽象语法树。

它完全不起作用。解析器将忽略额外的大括号集

编译此代码:

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))()
  }
}
[[解析器末尾的语法树]]
包装{
对象测试扩展了scala.AnyRef{
def()={
超级(;
()
};
defx=(()=>println(123))();
定义y=(()=>println(123))()
}
}
x
y
产生相同的抽象语法树