LoginSignup
4

More than 5 years have passed since last update.

そして世界はOptionにWrapされた

Posted at

ScalaとPlay frameworkの話。

Scalaに用意されたOptionクラスと、その実装のSomeがどれほど便利なのか、
体感するには、引数のバリデーションが適しているのではないでしょうか。

Play frameworkでは、POSTとしてJSONを受け取ることが簡単にでき、その
パーサーもキーを指定するだけでOptionでラップされた値を取得出来ます。

Optionでラップされている点が味噌で、Javaなら面倒だった引数のチェックを
簡単にすることができます。

例えば、引数からオブジェクトを作りたい場合はこんな感じ。

Application.scala
 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の式展開を使ってます。
それ以前の人は、適宜読み替えて欲しいです。

Output.scala
scala> class Output(name:String,age:Int){
     | def o = println(s"hey i am ${name}, and i'm ${age} old")
     | }
defined class Output

Someを使ってオブジェクトの作成を行う。

create.scala
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で処理をする。

exam1.scala
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しても何も起こらない。

exam2.scala
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に帰りたくなくなります。

それはそれで辛い。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4