Scala:匹配 case 类

8
以下代码显示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识别为学生?
2个回答

5
我认为这里发生的情况是,Student 类被声明在 Person 内部。因此,在 toString 中的 case Student 只会匹配属于特定 Person 实例的 Student
如果您将 case class Student 移动到与 case class Worker 平级的位置(然后从 object Narrator 中删除不必要的 extends Person("Jake") ... 这只是为了让 new Student 成为特定于 Jake 的 Person$Student),您会发现 Jane 确实学习生物。

你能澄清一下你所说的“特定的Person实例”是什么意思吗? - divider
有人知道这种行为在哪里有记录吗? - Luigi Plinge
@divider: friend 是一个 Narrator.Person,但不是一个 friend.Person - Alexey Romanov
更准确地说,它是一个“Narrator#Person”。 - Daniel C. Sobral
@LuigiPlinge:这是词法作用域的正常推论。 - Emil Sit

4

Emil说得完全正确,但这里有一个例子可以让它更清晰:

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

不幸的是,在Jake上实例化Jane时,this在Jane的情况下指向Jane本身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接