簡體   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