標籤:

關於scala的寫法問題,implicit request =>是什麼意思?

最近在學scala,看到下面這段代碼,不明白,求大神解釋。

Action.async { implicit request =&>

........

}

是在play2框架里的,implicit request =&> 寫法完全不懂,求解。


謝邀。

首先直接回答問題。題主的寫法相當於這麼寫:

Action.async { request =&>
implicit val r = request
//........
}

然後下面用一個簡單的例子來說明這個寫法。

首先假設我們有兩個函數:

def foo(f: Int =&> String) = ???
def bar(a: String)(implicit b: Int) = ???

具體實現不管,這裡我們只關心類型。

假設我們如此使用 foo:

foo { x: Int =&>
bar("test") // 找不到 implicit 參數
}

這裡,我們希望將 x 當作 bar 的第二個 implicit 參數。然而編譯器會報錯,因為即使 scope 中有一個類型為 Int 的變數(即 x),但它不是 implicit 的。所以我們必須引入一個 implicit 變數 y,使它和 x 相同即可:

foo { x: Int =&>
implicit val y = x
bar("test") // 編譯通過,y 為 implicit 參數
}

然而這樣寫很麻煩,明明都有 x 了,還要額外寫一個 implicit 變數,還要為它取名字。所以 Scala 允許我們進一步簡化為:

foo { implicit x: Int =&>
bar("test") // 編譯通過,x 為 implicit 參數
}


  1. Action.async{....} 這個表示的是調用(apply)Action對象的async方法,這個方法的參數是一個函數,而且是最後一個參數(只有這一個參數),所以可以省略括弧直接使用大括弧,生成一個匿名函數。
  2. 再說說函數體,題中的形式將參數放到了「{}」內部,參數與實現之間用 「=&>"分開,其實等價於implicit request =&> {...}
  3. 再說說 implicit 關鍵字,加在參數前面,表示提供了一個隱式參數,如果大括弧里的代碼有用到一個request類型的隱式參數,根據Scala的隱式參數查找機制,可找到該參數


推薦閱讀:

TAG:Scala |