在阅读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))()
}
}
x
和 y
产生相同的抽象语法树。
关于scala - 在内联执行之前将 Scala lambda 表达式包装在 block 中(使用大括号和圆括号)可以实现什么目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24591409/