Scala模式匹配Object

vvg*_*vvg 1 scala

任何人都可以解释对象行为的模式匹配.同一类的两个对象是否相同?

object Solution extends App {
  case class EE() { }
  object EE1 extends EE
  object EE2 extends EE
  val k: EE = EE1
  println(k.getClass) // class Solution$EE1$
  println(k.isInstanceOf[EE2.type]) // returns FALSE
  println(k.getClass.isInstanceOf[EE2.type.getClass]) // returns FALSE
  k match {
    case EE2 => println("EE1 match EE2!!!") // MATCH THIS LINE/// WHY???
    case EE1 => println("EE1 match EE1. OK!")
  }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*nov 6

当您case EE2在匹配中写入时,它会检查匹配的对象是否相等EE2(请注意,如果标识符以小写字母开头,则Lee的答案是正确的;此规则专门用于匹配objects和常量,其名称通常以大写字母,有意义).但因为EE1并且EE2两者都延伸case class EE(),它们是相等的(你可以直接用EE1 == EE2或检查k == EE2).如果你通过删除case它们使它们不相等,它会按预期工作:

object Solution extends App {
  class EE() { }
  object EE1 extends EE
  object EE2 extends EE
  val k: EE = EE1
  println(k.getClass) // class Solution$EE1$
  println(k.isInstanceOf[EE2.type]) // returns FALSE
  k match {
    case EE2 => println("EE1 match EE2!!!") // MATCH THIS LINE/// WHY???
    case EE1 => println("EE1 match EE1. OK!")
  }
}


Processing...
Reused last reload result
[info] Loading project definition from /tmp/renderer9oHZD8Bvx9/project/project
[info] Loading project definition from /tmp/renderer9oHZD8Bvx9/project
[info] Set current project to rendererWorker (in build file:/tmp/renderer9oHZD8Bvx9/)
[info] Reapplying settings...
[info] Set current project to rendererWorker (in build file:/tmp/renderer9oHZD8Bvx9/)

[info] Formatting 1 Scala source {file:/tmp/renderer9oHZD8Bvx9/}rendererWorker(compile) ...
[info] Reformatted 1 Scala source {file:/tmp/renderer9oHZD8Bvx9/}rendererWorker(compile).
[info] Compiling 1 Scala source to /tmp/renderer9oHZD8Bvx9/target/classes...
[success] Total time: 4 s, completed Aug 19, 2015 1:13:04 PM
Now running...
[info] Running Solution 
class Solution$EE1$
false
EE1 match EE1. OK!
[success] Total time: 0 s, completed Aug 19, 2015 1:13:04 PM
Run Code Online (Sandbox Code Playgroud)