Scalaで本格的にプログラミングを始めたのが昨年の7月だから、だいたいScala歴1年8ヶ月ということになる。結構沢山のコードを書いてきたけど、最近分かってきたのはOptionの威力。Optionを使えるようになってくるとScalaプログラムが見違えるようになる。この点が腑に落ちるまでずいぶんかかった。
Optionはメソッドの結果型に使用することが多いけど、インスタンス変数に使うのも相当クールである。
たとえば、以下のクラスPersonのような感じでOptionを使う。最近、こういうOptionの使い方を多用するようになった。
Person.scala
class Person(val name: String) { var zip: Option[String] = None var prefecture: Option[String] = None var city: Option[String] = None def address: String = { (for (Some(s) <- List(zip, prefecture, city)) yield s).mkString(" ") } }
addressメソッドは、インスタンス変数zip, prefecture, cityを接続して住所を生成するメソッド。この実装がfor-comprehension, pattern matching, ListというScalaの特徴的な機能を活かした文になっている。また、このfor文がOptionと相性がよいという点も重要。このテーマはいずれ取り上げようと思うけど、ここではこういった機能を使うことで複雑な処理を簡単に書けるということをアピールしておきます。
次はクラスPersonのインスタンス変数を生成するスクリプト。変数の型がOption[String]になっているため、変数に設定する時に「Some(XXX)」という形になっているのがあまり美しくないけど、このような瑕など気にならなくなるくらいOptionのメリットは大きい。
tryout.scala
val 山田さん = new Person("山田太郎") { zip = Some("221-0000") prefecture = Some("神奈川県") city = Some("横浜市") } val 鈴木さん = new Person("鈴木花子") { zip = Some("556-0000") city = Some("大阪市") }
REPLでの実行結果は以下の通り。
scala> 山田さん address res68: String = 221-0000 神奈川県 横浜市
scala> 鈴木さん address res70: String = 556-0000 大阪市
今日はOptionについていくつか論点を挙げた。面白いテーマなので追々取り上げていこうと思う。