ScalaとPlay frameworkの話。
Scalaに用意されたOptionクラスと、その実装のSomeがどれほど便利なのか、
体感するには、引数のバリデーションが適しているのではないでしょうか。
Play frameworkでは、POSTとしてJSONを受け取ることが簡単にでき、その
パーサーもキーを指定するだけでOptionでラップされた値を取得出来ます。
Optionでラップされている点が味噌で、Javaなら面倒だった引数のチェックを
簡単にすることができます。
例えば、引数からオブジェクトを作りたい場合はこんな感じ。
def notification = Action(parse.json){ request =>
val optText = request.body.\("text").asOpt[String]
val optId = request.body.\("id").asOpt[String]
val optUser = request.body.\("user").asOpt[String]
val tweet = for(text <- optText; id <- optId; user <- optUser) yield new Tweet(text,id,user)
}
スゴイ!Optionスゴイよ!!(あと、forとかyieldも)
ちなみに、yieldでオブジェクトを作るとOptionでラップされた物が
帰ってきます。
という訳で、Optionの動きをおさらいしときます。
恒例のサンプルのクラスは、引数に名前と年齢を受け取って
出力するもの。
ちなみに、出力部分はScala2.10の式展開を使ってます。
それ以前の人は、適宜読み替えて欲しいです。
scala> class Output(name:String,age:Int){
| def o = println(s"hey i am ${name}, and i'm ${age} old")
| }
defined class Output
Someを使ってオブジェクトの作成を行う。
scala> val name = Some("numa08")
name: Some[String] = Some(numa08)
scala> val age = Some(24)
age: Some[Int] = Some(24)
forとyieldを使ってOutputオブジェクトの作成。
帰ってきた値はOptionにラップされた物なので、例えばforeachで処理をする。
cala> val out = for(n <- name; a <- age) yield new Output(n,a)
out: Option[Output] = Some(Output@33264613)
scala> out.foreach(o => o.o)
hey i am numa08, and i'm 24 ol
引数のいずれかがNoneの場合、for文はNoneを帰します。
なので、foreachしても何も起こらない。
scala> val out =for(n <- noname; a <- age) yield new Output(n,a)
out: Option[Output] = None
scala> out.foreach(o => o.o)
値がNullの場合の考慮を省くことができているので、コードが
結構スッキリしてくると思います。
そんなわけで、Scalaは便利です。正直、Javaに帰りたくなくなります。
それはそれで辛い。