読み解き PiS3: ケースクラスのパターンマッチング(Constructor パターン)

  • case class は abstract class の派生でなくてもいい。コップ本だと Expr の派生クラスとして UnOp や BinOp クラスを定義しているが別に親がいなくてもいい。
  • パターンマッチのブロックの中の e はパターンに束縛される一時変数。「この e はどこから出てきたんだ」と思ってしまった。これは慣れるしかない。

In this example, note that the first three alternatives evaluate to e, a variable that is bound withinthe associated pattern. (Chapter 15. Case Classes and Pattern Matching)

  • パターンは以下の種類がある。
    • Wildcards, Constant, Variable, Constructor, Sequence, Tupple, Typed
  • Expr の例はパターンマッチの Constructor パターンに該当する。自分でも Constructor パターンを試してみる。
case class Room(number: Int, kind: String)

val r1 = Room(1001, "single")
val r2 = Room(2001, "double")

def tellMeRoomKind(r: Room): Unit = {
  r match {
    case Room(n, "single") => println(s"Room $n is a single room.")
    case Room(n, "double") => println(s"Room $n is a double room.")
    case Room(n, _) => println(s"Room $n is unknown-kind room.")
  }
}

tellMeRoomKind(r1)
  • パターンマッチも慣れてくれば「これはこのパターンだな」と認識できて、ぐっと表現の幅が広がりそう。Scala は文脈によっていろいろな意味を持たせられるようだ。慣れていないと簡潔な表現を読み解くのが大変な反面、慣れてしまえばその簡潔さゆえに、読み書きともかなりスピードがあがるはず。 (´͈ ᗨ `͈ )