C#プログラマーのScalaの道第10章(パターンマッチング)

6463 ワード

1.サンプルクラス
クラスの前にキーワードcaseを加えると、このクラスがサンプルクラスであり、サンプルクラスがインスタンス化されるとnewキーワードを使わずに次のようになります.
case class A()
object Hello extends App {
  val v = A  //       
  val b = new A
}

サンプルクラスの2つ目の利点は、彼があなたのクラスパラメータを引用してvalを得ることです.以下のようにします.
case class A(name: String)
object Hello extends App {
  val a = A("name")
  println(a.name)
}

2.パターンマッチング
パターンマッチングは、次のコードのような強力な機能です.
abstract class Base
case class A(name:String,age:Int) extends Base
case class B(age:Int,name:String) extends Base

object Hello extends App {
  def baseMatch(base: Base): String = base match{
    case A(value,21) => value
    case B(value,"name2") => value.toString
    case _=> null
  } 
  
  val a = A("name",21)
  val b = B(22,"name2")
  
  println(baseMatch(a))
  println(baseMatch(b))
}

重要なのはcase A(value,21)がcase B(value,「name 2」)モードと一致してオブジェクトの値に一致することである.
これはswitchの機能と似ていますが、switchよりも多くの変化があり、オブジェクトの値を直接マッチングしたり、オブジェクトを直接マッチングしたりすることができます.
3.変数モードと定数モード
次のコードを見てください.
object Hello extends App {
  def matchAny(expr : Any) =
    expr match{
    case 0=>"zero"
    case value => "value :" +value
  }
  println(matchAny(0))
  println(matchAny("123456"))
  println(matchAny(123456))
}

valueは変数モード、0は定数モードを採用しています
変数モードは、変数自体をワイルドカードとしてマッチングします.
4.シーケンスモード
次のコードがあります.
object Hello extends App {
  def matchAny(expr: Any) =
    expr match {
      case List(0, 1, _, value) => value
      case _ => Nil
    }
  println(matchAny(0))
  println(matchAny(List(0, 1, 4, 5)))
  println(matchAny(List(0, 1, 3, 9)))
}

5.タプルモード
次のコードがあります.
object Hello extends App {

  def tupleAny(expr: Any) =
    expr match {
      case (a, b, c) => println("matched :" + a + b + c)
      case _ => Nil
    }

  tupleAny(("a", 1, 3.14))
}

6.タイプパターン
次のコードがあります.
object Hello extends App {

  def typeMatch(value: Any) =
    value match {
      case x: String => x.length
      case map: Map[_, _] => map.size
      case _ => Nil
    }

  println(typeMatch("String"))
  println(typeMatch(Map(1 -> "a", 2 -> "b")))
}

 7.モードガード
式に一致した後にif文を付けるコードは次のとおりです.
object Hello extends App {
  def typeMatch(value: Any) =
    value match {
      case List(1,2,3,e @ _,y) if e == y => e
      case _ => false
    }
  println(typeMatch(List(1,2,3,5,5)))
}

 
詳細はscalaプログラミングを参照してください