- 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 は文脈によっていろいろな意味を持たせられるようだ。慣れていないと簡潔な表現を読み解くのが大変な反面、慣れてしまえばその簡潔さゆえに、読み書きともかなりスピードがあがるはず。 (´͈ ᗨ `͈ )