2009-10-08 9 views
3

Je passais en revue les tests de scala et je ne comprends pas pourquoi le compilateur produit un avertissement lorsque vous comparez "deux nouveaux objets".Scala: comparer des objets frais

C'est le test » sorties: http://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/test/files/neg/checksensible.check

Exemple:

checksensible.scala:12: warning: comparing a fresh object using `!=' will always yield true 
println(new Exception() != new Exception()) 
         ^

Si j'écris une classe qui implémente une méthode == elle produit aussi cet avertissement:

class Foo(val bar: Int) { 
    def ==(other: Foo) : Boolean = this.bar == other.bar 
} 

new Foo(1) == new Foo(1) 

warning: comparing a fresh object using `==' will always yield false 

EDIT: Merci oxbow_lakes, je dois passer outre la metho égale d, pas le ==

class Foo(val bar: Int) { 
    override def equals(other: Any) : Boolean = other match { 
     case other: Foo => this.bar == other.bar 
     case _ => false 
    } 
} 

Répondre

13

Notez que vous devez jamais remplacer la méthode== (vous devez remplacer la méthode equals à la place). Je suppose que par un objet frais, Scala signifie un nouvel objet sans une méthode définie equals.

Si vous ne remplacez equals, la comparaison == est une comparaison de référence (à savoir l'utilisation eq) et, par conséquent:

new F() == new F() 

sera toujours faux.

+0

Ceci n'est apparemment pas vrai pour les classes de cas, où Scala effectue une vérification d'égalité extensionnelle par défaut. PAR EXEMPLE. "case class F(); println (nouveau F() == new F())" –

+1

Pour les classes de cas "égal à" _is_ substitué. –