以下代码声称杰克受雇于建筑业,但简是另一个粗暴经济的受害者:
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"
}
}
Run Code Online (Sandbox Code Playgroud)
为什么比赛未能将Jane视为学生?
我认为这里发生的是Student案例类是在里面声明的Person.因此case Student,toString遗嘱中只会匹配Student特定Person实例的一部分.
如果你移动case class Student到平行于case class Worker(然后删除不必要extends Person("Jake")的object Narrator......只有那里,以便new Student伤口Person$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
Run Code Online (Sandbox Code Playgroud)
更准确地说,这一行:
case Student(name, major) => name + " studies " + major
Run Code Online (Sandbox Code Playgroud)
真正意思
case this.Student(name, major) => name + " studies " + major
Run Code Online (Sandbox Code Playgroud)
不幸的是,虽然 Jane 是在 Jake 上实例化的,但this在 Jane 的例子中却指向 Jane 本人。