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