2011-10-19 292 views
8

下面的代碼聲稱傑克建築採用,但簡是粗糙經濟的又一個受害者:斯卡拉:匹配case類

abstract class Person(name: String) { 

    case class Student(name: String, major: String) extends Person(name) 

    override def toString(): String = this match { 
    case Student(name, major) => name + " studies " + major 
    case Worker(name, occupation) => name + " does " + occupation 
    case _ => name + " is unemployed" 
    } 
} 

case class Worker(name: String, job: String) extends Person(name) 

object Narrator extends Person("Jake") { 
    def main(args: Array[String]) { 
    var friend: Person = new Student("Jane", "biology") 
    println("My friend " + friend) //outputs "Jane is unemployed" 
    friend = new Worker("Jack", "construction") 
    println("My friend " + friend) //outputs "Jack does construction" 
    } 
} 

爲什麼比賽沒有認識到簡的學生?

回答

4

周華健是完全正確的,但這裏有一個例子可以更清晰:

scala> case class A(a: String) { 
    | case class B(b: String) 
    | def who(obj: Any) = obj match { 
    |  case B(b) => println("I'm A("+a+").B("+b+").") 
    |  case b: A#B => println("I'm B("+b+") from some A") 
    |  case other => println("Who am I?") 
    | } 
    | } 
defined class A 

scala> val a1 = A("a1") 
a1: A = A(a1) 

scala> val a2 = A("a2") 
a2: A = A(a2) 

scala> val b1= a1.B("b1") 
b1: a1.B = B(b1) 

scala> val b2 = a2.B("b2") 
b2: a2.B = B(b2) 

scala> a1 who b1 
I'm A(a1).B(b1). 

scala> a1 who b2 
I'm B(B(b2)) from some A 

更確切地說,這條線:

case Student(name, major) => name + " studies " + major 

的真正含義

case this.Student(name, major) => name + " studies " + major 

不幸,而Jane在Jake上實例化,Jane在案件中this指向Jane自己。

5

我相信這裏發生的是Student案例類正在Person內宣佈。因此toString中的case Student將只匹配Students,它們是特定Person實例的一部分。

如果將case class Student平行於case class Worker(然後從object Narrator刪除不必要的extends Person("Jake") ...這是唯一有這樣的new Student清盤是一個Person$Student具體到傑克),你會發現簡做確實研究生物學。

+0

你能澄清你的意思是「一個特定的人物實例」嗎? – divider

+0

任何人都知道這種行爲是否記錄在任何地方? –

+0

@divider:'friend'是一個'Narrator.Person',但不是'friend.Person'。 –