2012年1月24日火曜日

Scala Tips / Option (2)

null値の可能性がある値をOptionに持ち上げるイディオムです。

Scalaでは、できるだけnull値を使わないようにするのが、プログラミングのコツになっています。そのため、既存のJavaプログラムから戻ってきた値などを速やかにOptionに持ち上げる、といった処理がよく出てきます。この処理を簡潔に書けるイディオムを覚えておくとプログラミングがスムーズになります。

(分類の基準)

Java風

if式で変数がnullかどうかを判定します。

def f(a: String): Option[String] = {
  if (a == null) None
  else Some(a)
}

実際に使う時は以下のような感じになります。

val b = if (a == null) None else Some(a)

Scala風

match式を使うこ以下のようになります。この場合は、Java風の方が簡潔ですね。

def f(a: String): Option[String] = {
  a match {
    case null => None
    case _ => Some(a)
  }
}

Scala

Optionオブジェクトに目的にぴったりあうメソッドapplyがあるので、これを使うのがイディオム。Option(a)は、Optionオブジェクトのapplyメソッドを呼び出す簡略記法です。

def f(a: String): Option[String] = {
  Option(a)
}

Optionの持つ基本機能なのでイディオムというのも大げさですが、ボクも長年この使い方を知らずに損なコーディングをしていたので、イディオムとしてまとめておきました。(Scala 2.8でサポートされた機能のようです。)

パッと見は Option(null) とすると Some(null) が返ってきそうですが、None が返って来てくれるということですね。Some(null) が欲しい場合には、文字通り Some(null) とします。

Scalaz

Scalaz流のエレガントな書き方はないと思います。

利用シーン

Scalaでnullを使いたいユースケースとして、メソッドのデフォルト値があります。(いずれイディオムとして取り上げたいと思います。)

case class Person(name: String, address: Option[String])

object Person {
  def apply(name: String, address: String = null) = {
    new Person(name, Option(address))
  }
}

ここを以下のようにしたくないということですね。

new Person(name, if (address == null) None else Some(address))

0 件のコメント:

コメントを投稿