簡體   English   中英

Scala:匹配案例類

[英]Scala: Matching case classes

以下代碼聲稱傑克受雇於建築業,但簡是另一個粗暴經濟的受害者:

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內部聲明的。 因此, case StudenttoString將只匹配Student S中的一個特定的一部分Person的實例。

如果你將case class Student移動到case class Worker並行(然后從object Narrator刪除不必要的extends Person("Jake") ......這只是為了讓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

更確切地說,這一行:

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

真正意思

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

不幸的是,雖然Jane在Jake身上實例化, this在簡的情況下,Jane指的是Jane。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM