PlayframeworkのControllerのメソッド、Action{}とはなんぞや?の整理。
def index() = Action{ implicit request => Ok("Hello World") }
自分なりの解釈なので、間違ってたらごめんなさい。
Actionの定義
Action.scalaのActionBuildertraitの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!!") )}
としても動作する。
リンク
リンク
