あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

Option#getOrElse

前に勉強用に書いたXMLファイルの要素と属性の表示「XMLファイルの要素と属性をベタに表示」はXMLファイルにXML宣言がない場合は処理できなかったので、Opttion#getOrElse でXMLファイルにXML宣言がない場合は、デフォルトのエンコーディングUTF-8 を指定するように変更しました。
encoding メソッドはXMLファイルからエンコーディングを取得して Some を返しますが、XMLファイルからエンコーディングが読めない場合は None を返します。
encoding から返された Option[String] が None かを isEmpty で判断してたのですが、Option#getOrElse を使用して None の場合 "UTF-8" をデフォルトのエンコーディングに指定するように変更しました。

(変更前)

..snip..
  def main(args: Array[String]): Unit = {
    val enc = encoding(args(0))
    if (enc.isEmpty) {
      println("not XML file : " + args(0))
      return
    }
    println("encoding = " + enc.get)

    val f = new java.io.File(args(0))
    val s = Source.fromFile(f, enc.get)
..snip..


(変更後)

..snip..
  def main(args: Array[String]): Unit = {
    val f = new java.io.File(args(0))
    if (!f.exists) {
      println("none file : " + args(0))
      return
    }
    val enc = encoding(args(0)).getOrElse("UTF-8")
    println("encoding = " + enc)

    val s = Source.fromFile(f, enc)
..snip..

Optoin には None の場合に引数に指定したオブジェクトを返してくれるメソッドがあったのですね。
似ているメソッドに orElse があるが Option[T] 型を扱う必要がない場合は、 orElse ではなく getOrElse ですね。
Option#getOrElse は None の場合に指定した v を返しますが Option#orElse は None の場合に指定した Some(v) を返します。