scala - 在内联执行之前将 Scala lambda 表达式包装在 block 中(使用大括号和圆括号)可以实现什么目的?

标签 scala lambda

在阅读article时在 monads 上,我注意到作者使用大括号将他的 lambda 包裹在 block 中:

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 产生相同的抽象语法树。

关于scala - 在内联执行之前将 Scala lambda 表达式包装在 block 中(使用大括号和圆括号)可以实现什么目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24591409/

相关文章:

scala - 奇怪的错误消息 : bad symbolic reference. package.class 中的签名指的是包 org 中的术语 apache,该术语不可用

scala - 按键分组时,Spark 内存不足

scala - 如何区分宏中的三引号和单引号?

python - lambda 的字符串表示

c++ - 在 MSVC C++ 中强制内联 lambda

scala - 如何使用 Actor 解决scala中的方程式?

scala - Slick 中的动态查询参数(排序)

c++ - 如何将模板 lambda 传递给函数并将其与不同类型一起使用

Python 排序 : Bad Operand Type for Unary -: 'str'

python - AWS LAMBDA "errorMessage": "[Errno 30] Read-only file system: ' drive-python-quickstart. json'"