2011-10-19 13 views
8

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 " + 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は学生としてJaneを認識できませんか?

答えて

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の中で宣言されていると思います。したがって、toStringcase Studentは、特定のPersonインスタンスの一部であるStudentと一致します。

あなたは(new Studentがジェイクに固有Person$Studentさ巻き上げるようにのみ存在している...そしてobject Narratorから不要なextends Person("Jake")を除く)case class Workerと平行になるようにcase class Studentを移動した場合、あなたはジェーンはないでしょう確かに生物学を学ぶ。

+0

"特定のPersonインスタンス"が意味することを明確にすることはできますか? – divider

+0

この動作がどこに文書化されているかは誰でも知っていますか? –

+0

@divider: 'friend'は' Narrator.Person'ですが、 'friend.Person'はありません。 –