案例類別(Case class)
在 match 運算式 中看過 match 運算式可以比對數字與字串,實際上,match 可以比對的是模式(Pattern),在正式了解各種模式之前,先來看看所謂的 案例類別(Case class),以作為之後模式比對的說明基礎。
一個案例類別,是在類別定義時加上 case 關鍵字,例如:
- case class Point(x: Int, y: Int)
對於案例類別,編譯器會對它動些手腳,首先就是編譯器會建立一個以 Point 為名的工廠方法(Factory method),所以你可以這麼建立 Point 的實例,而不用使用 new 來建立:
- val p = Point(1, 2)
- val p = Point(1, 2)
- println("(" + p.x + ", " + p.y +")") // 顯示 (1, 2)
- val p1 = Point(1, 2)
- val p2 = Point(1, 2)
- val p3 = Point(2, 1)
- println(p1) // 顯示 Point(1, 2)
- println(p2) // 顯示 Point(1, 2)
- println(p3) // 顯示 Point(2, 1)
- println(p1 == p2) // 顯示 true
- println(p1 == p3) // 顯示 false
- def go(p: Point) = p match {
- case Point(0, 0) => "原點"
- case Point(10, 10) => "終點"
- case _ => "巡迴 " + p
- }
- println(go(Point(0, 0))) // 顯示原點
- println(go(Point(0, 1))) // 顯示巡迴 Point(0,1)
- println(go(Point(2, 3))) // 顯示巡迴 Point(2,3)
- println(go(Point(10, 10))) // 顯示終點
案例類別運用於模式比對時,也可以形成巢狀,例如:
- case class Point(x: Int, y: Int)
- case class Circle(p: Point, r: Int)
- def what(c: Circle) = c match {
- case Circle(Point(0, 0), _) => "原點的圓"
- case Circle(Point(10, 10), _) => "終點的圓"
- case _ => "其它的圓"
- }
- println(what(Circle(Point(0, 0), 10))) // 顯示原點的圓
- println(what(Circle(Point(10, 10), 20))) // 顯示終點的圓
- println(what(Circle(Point(5, 5), 30))) // 顯示其它的圓
- case class Point(x: Int, y: Int)
- case class Circle(p: Point, r: Int)
- def what(c: Circle) = c match {
- case Circle(Point(0, 0), r) => "原點的圓, 半徑 " + r
- case Circle(Point(10, 10), r) => "終點的圓, 半徑 " + r
- case Circle(_, r) => "其它的圓, 半徑 " + r
- }
- println(what(Circle(Point(0, 0), 10))) // 顯示原點的圓, 半徑 10
- println(what(Circle(Point(10, 10), 20))) // 顯示終點的圓, 半徑 20
- println(what(Circle(Point(5, 5), 30))) // 顯示其它的圓, 半徑 30
沒有留言:
張貼留言