PlayframeworkのControllerのメソッド、Action{}
とはなんぞや?の整理。
def index() = Action{ implicit request => Ok("Hello World") }
自分なりの解釈なので、間違ってたらごめんなさい。
Actionの定義
Action.scala
のActionBuilder
traitのapplyメソッドのシンタクス。つまり省略せずに書くと、こういことと同義。
def index() ={ Action.apply( (request) => { Ok("hello") } ) }
または、
def index() = { Action.apply( implicit request => { Ok("hello") }) }
Action.scala
のActionBuilder
はControllerの継承ツリーではなくてimport play.api.mvc._
でObjectを読み込んでいるんだと思う。
定義的には同ファイル内のActionBuilderImpl
がtraitActionBuilder
をmixinし、objectActionBuilder
がActionBuilderImpl
を継承しているっぽい。objectがapplyしてるのかなあと思ったけどどうやら違うっぽい。
ActionBuilder applyの定義
これはほぼ見たまま。
final def apply(block: R[B] => Result): Action[B] = async(block.andThen(Future.successful))
引数block: R[B] => Result
はResult
型を返す高階関数をとる。つまり
{ implicit request =>
Ok("Hello World")
}
のラムダ式部分がapplyの引数。
block.andThen(Future.successful)
この部分で、block
の実行結果、すなわち定義した高階関数の結果、Result
をandThen
でFuture.successful
に渡す。
と読める。
すなわち、implicit request
にアクセスする必要がないならば、
def index() = Action.async{ Future.successful( Ok("hello World!!") )}
としても動作する。
リンク
リンク