teruroom's diary

てるるーむのプログラミングダイアリー

パターンマッチング

 ここのところScalaをさわっています。ずいぶん前にRubyを触った時にはずいぶん苦労した思い出があります。それもそのはず。Rubyは僕が長らく親しんできた静的言語ではなく、パーフェクトな動的言語なのです。

 で、Scalaはどうかというと、ベースがJVMで動く。つまりJavaバイトコードに最終的に変換されて動くのです。なので、Javaと同じ静的言語なんですよね。だから、取っ付きがとてもいい。

 しかも、ScalaJavaの様にマシン依存のプリミティブ型を持つ不完全なオブジェクト指向ではありません。言語仕様で定義されるすべてがオブジェクトなのです。つまりパーフェクトなオブジェクト指向言語なのです。その上、関数型プログラミングという新しいパラダイムの言語仕様を取り入れている。

 なので、動的言語であるRubyほど柔軟ではありませんが、Javaに比べればかなり柔軟なプログラミングが可能です。パターンマッチングもその一つ。かなり柔軟です。

 定数「誰か」をAny型としておいてあいまいなまま宣言できます。そして、この定数にどんな型が定義されてもそれをパターンマッチングできます。しかも、case文も柔軟で、case文にif文を絡めてフィルタリング出来てしまいます。なんて簡潔にわかりやすくプログラムが書けるのでしょうか。ちょっと感動です。

object パターンマッチング {
  def main(args: Array[ String] ){
    val 数字 = 777
    数字 match {
      case 111 => println( "数字 は 111 です" )
      case 777 => println( "数字 は 777 です" )
      case _ => println( "数字 は 111 または 777 以外の数字です" )
    }
    val 誰か:Any = "荻野香音"
    val 年齢 = 誰か match {
      case i:Int => println( "誰か = " + i.toString() ); 1
      case s:String => println( "誰か = " + s ); 11
      case _ => println( "その他" ); -1
    }
    println( "年齢 = " + 年齢 +" 才")
    //パターンガード
    val 値段:Any = 70
    val 評価 = 値段 match {
      case i:Int if i >= 1000 => println( "値段は 1000円 以上です" ); "1000円以上"
      case _ => println( "値段は 1000円以下です" ); "1000円以下"
    }
    println( "評価 = " + 評価 )
  }
}

【実行結果】

数字 は 777 です
誰か = 荻野香音
年齢 = 11 才
値段は 1000円以下です
評価 = 1000円以下