読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

CaseClassとパターンマッチング

Scala

beginner's guideの「6 Case classes and pattern matching」より。ScalaではCaseClassというのを使ってパターンマッチングができるらしい。

サンプルコードは以下。

  • Classにはcaseを付けて宣言します。
  • 関数では「def <関数名>(<引数..>):<戻り値の型> = <分岐条件> match { ... }」として、
  • 関数の本文の中で「case <型> => <処理>」として、マッチングした場合の処理を書きます。
// Case Class
abstract class Animal
case class Kitten(name:String, age:int)  extends Animal
case class Tiger(name:String, age:int)   extends Animal
case class Lion(name:String, age:int)    extends Animal
case class Dog(name:String, age:int)     extends Animal

// Case Class を使うサンプル
object CaseClassSample {
  
  // Classのパターンマッチングで分岐する関数。
  // 引数のanimalの型で分岐する
  def call( animal:Animal ) : Unit = animal match {
    case Kitten(name:String, age:int) => 
        // animal が Kitten の場合ここにくる
        println("kitten :" + name)
    case Tiger(name:String, age:int)  => 
        // animal が Tiger の場合ここにくる
        println("tiger :" + name)
    case Lion(name:String, age:int) if (age == 0) => 
        // if でガード条件を付けることもできます。
        println("child lion : " + name)
    case Lion(name:String, age:int)   => 
        println("lion : " + name)
    case _      => 
        // パターンにマッチしない場合ここに来る。
        println( "?")
  }
  
  // メイン
  def main(args: Array[String]):Unit = {
    call( Kitten("mii", 1) ) // case classではnewは不要らしい。
    call( Tiger("tora", 1) )
    call( Lion("leo", 0) )
    call( Lion("leon", 2) )
    call( Dog("poti", 1) )
  }
}

実行結果です。

kitten :mii
tiger :tora
child lion : leo
lion : leon
?

うーん、分岐できるのはわかったけどいまいち使い道がわかりません・・・。そもそも、関数型の考え方とかメリットがわかってないんだよなー、むー。