Oop Scala:匹配案例类

Oop Scala:匹配案例类,oop,scala,Oop,Scala,以下代码声称Jack受雇于建筑业,但Jane是经济不景气的另一个受害者: 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

以下代码声称Jack受雇于建筑业,但Jane是经济不景气的另一个受害者:

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"
  }
}

为什么比赛没有认出Jane是学生?

我认为这里发生的事情是
Student
案例类在
Person
中声明。因此,
toString
中的
case Student
将只匹配属于特定
个人
实例的
Student
s


如果您将
案例班学生
移动到与
案例班工作人员
平行的位置(然后从
对象讲述者
中删除不必要的
扩展人(“Jake”)
…该对象讲述者仅在那里,
新学生
最终成为特定于Jake的
人$Student
),你会发现简的确学过生物学。

埃米尔完全正确,但这里有一个例子可以说明:

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的例子中是指向Jane自己的。

你能澄清你所说的“一个特定的人实例”是什么意思吗?有人知道这种行为在哪里有记录吗?@divider:
friend
是一个
叙述者。Person
,但不是一个
朋友。Person
@AlexeyRomanov更准确地说,它是一个
叙述者#Person
@luigipling:这是词汇范围界定的正常含义。