5. ワイルドカードパターン
expr match {
case BinOp(op , left , right)
=> println(expr + " は二項演算")
case _ => println(“その他”)
}
Javaのswitchでいうdefaultみたいなもん
6. ワイルドカードパターン
expr match {
case BinOp(_ , _ , _)
=> println(expr + " は二項演算")
case _ => println(”その他”)
}
引数の数を見るだけならこんな書き方も
7. 定数パターン
def describe(x: Any) = x match {
case 5 => ”五”
case true => ”真実”
case ”hello” => ”こんにちは”
case Nil => ”空っぽのリスト”
case _ => ”その他”
}
Javaと違っていろんな型が使える
8. 変数パターン
expr match {
case 0 => ”ぜろ”
case somethingElse
=> ”ぜろ以外”+ somethingElse
}
動き的にはワイルドカードと同じ
でも、マッチした値を変数に束縛
13. case class
abstract class Pet
case class Dog(name: String) extends Pet
case class Cat(name: String) extends Pet
case修飾子をつけるだけ
val genki = Dog(”げんき”)
val kitty = Cat(”キティー”)
new がいらない!
15. case class ほかにも
toString
hashCode
equals
これらの「自然な」実装を追加してくれる
16. toString
class Dog(name:String)
val dog = new Dog(”りき”)
Dog@33063f5b
case class Dog(name:String)
val dog = Dog(”りき”)
Dog(りき)
いい感じ
17. equals
class Dog(name:String)
val dog = new Dog(”りき”)
val dog2 = new Dog(”りき”)
dog == dog2
false
case class Dog(name:String)
val dog = Dog(”りき”)
val dog2 = Dog(”りき”)
dog == dog2
true
いい感じ
18. シーケンスパターン
expr match {
case List(0, _, _) => println(“見つけた”)
case _ =>
}
固定数
expr match {
case List(0, _*) => println(“見つけた”)
case _ =>
}
先頭だけ見る
19. タプルパターン
def tupleDemo(expr: Any) =
expr match {
case (a, b, c)
=> println(“みつけた” + a + b + c)
case _ =>
}
scala>tupleDemo(1,”abc”,List(1,2,3))
みつけた 1 abc List(1,2,3)
20. 型付パターン
def generalSize(x: Any) =
x match {
case s: String => s.length
case m: Map[_ ,_] => m.size
case _ => -1
}
scala>generalSize(Map(”1”->123,”2”,456))
res1: AnyVal = 2
21. パターンガード
x match {
case n: Int if n > 0 => println(”自然数”)
case s: String if s(0) == ’a’
=> println(”aから始まる”)
case _ =>
}
22. シールドクラス
sealed abstract class Pet
case class Dog(name: String) extends Pet
case class Cat(name: String) extends Pet
case class Cow(name: String) extends Pet
def sealedMatch(p: Pet) =
p match {
case d: Dog => ”いぬの名前は” + d.name
}
<console>:11: warning: match may not be exhaustive.
It would fail on the following inputs: Cat(_), Cow(_)
23. 変数の束縛
sealed abstract class Pet
case class Dog(name: String) extends Pet
case class Cat(name: String) extends Pet
case class Cow(name: String) extends Pet
def sealedMatch(p: Pet) =
p match {
case Dog(x @ _) => ”いぬの名前は” + x
case _ => ”そのた”
}
24. 変数定義でパターン
val tuple = (123, ”ABC”)
val (number,string) = tuple
number: Int = 123
string: String = ABC
case class Op(op:String, left:Int, right:Int)
val plusOp = Op(”+”, 2, 5)
val Op(op,left,right) = plusOp
op: String = +
left: Int = 2
right: Int = 5