2015-08-19 3 views
1

Может ли кто-нибудь объяснить сопоставление шаблонов над поведением объекта. Являются ли два объекта одного класса одинаковыми?Scala pattern matching over Object

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!") 
    } 
} 

ответ

6

Когда вы пишете case EE2 в матче, он проверяет, подходящий объект для равенства с EE2 (заметим, что если идентификатор начала с строчной буквы, ответ Ли было бы правильно, это правило существует специально, чтобы сделать согласование object s и константы, чьи имена обычно начинаются с прописных букв, имеют смысл). Но так как EE1 и EE2 оба расширения case class EE(), они равны (вы можете напрямую проверить EE1 == EE2 или k == EE2). Он работает как ожидалось, если вы сделаете их неравными by removing 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