任何人都可以解释对象行为的模式匹配.同一类的两个对象是否相同?
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)
当您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)
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |