![](/img/trans.png)
[英]What is the formal difference in Scala between braces and parentheses, and when should they be used?
[英]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))()
}
}
x
和y
導致相同的抽象語法樹。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.