C#プログラマーのScalaの道第10章(パターンマッチング)
6463 ワード
1.サンプルクラス
クラスの前にキーワードcaseを加えると、このクラスがサンプルクラスであり、サンプルクラスがインスタンス化されるとnewキーワードを使わずに次のようになります.
サンプルクラスの2つ目の利点は、彼があなたのクラスパラメータを引用してvalを得ることです.以下のようにします.
2.パターンマッチング
パターンマッチングは、次のコードのような強力な機能です.
重要なのはcase A(value,21)がcase B(value,「name 2」)モードと一致してオブジェクトの値に一致することである.
これはswitchの機能と似ていますが、switchよりも多くの変化があり、オブジェクトの値を直接マッチングしたり、オブジェクトを直接マッチングしたりすることができます.
3.変数モードと定数モード
次のコードを見てください.
valueは変数モード、0は定数モードを採用しています
変数モードは、変数自体をワイルドカードとしてマッチングします.
4.シーケンスモード
次のコードがあります.
5.タプルモード
次のコードがあります.
6.タイプパターン
次のコードがあります.
7.モードガード
式に一致した後にif文を付けるコードは次のとおりです.
詳細はscalaプログラミングを参照してください
クラスの前にキーワード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プログラミングを参照してください