2012-03-24 25 views
7

Scala'da Programlama ile okuyorum. Şöyle ki:Scala: == Varsayılan eşittir?

Hep sınıftan Any devralınan equals yöntemi, geçersiz kılarak yeni türleri için == davranışını yeniden tanımlamak edebilirsiniz. Java'da olduğu gibi geçersiz kılınmadıkça geçerli olan, devralınan equals nesnel kimliktir. Yani equals (ve == ile) varsayılan olarak eq ile aynıdır, ancak tanımladığınız sınıflarda equals yöntemini geçersiz kılarak davranışını değiştirebilirsiniz. Any sınıfında son bir yöntem olarak tanımlandığı için, =='u doğrudan geçersiz kılmak mümkün değildir. Yani Scala == davranır, olduğu gibi sınıfta Any aşağıdaki şekilde tanımlandı ise:

final def == (that: Any): Boolean = 
    if (null eq this) (null eq that) else (this equals that) 

Ama bu nasıl bir şey görünüyor scala 2.9.1 içinde görüyorum şeyle jibing değildir:

  • ==
      I (, derleyici şikayet olmadan gerekmez override) doğrudan == geçersiz kılabilir
    • equals varsayılan olarak görünmüyor.

    Yani böyle ya bana öyle geliyor: Yanlış yapıyorum

    • - this definition of Rational

      % scala                 
      Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_29). 
      Type in expressions to have them evaluated. 
      Type :help for more information. 
      
      scala> Rational(1) == Rational(1) 
      res0: Boolean = false 
      
      scala> Rational(1) equals Rational(1) 
      res1: Boolean = true 
      
    • verir ya da ben eski bir sürümünü yetersiz okuyorum kitap ve şeyler değişti.

    Neler oluyor?

  • cevap

    21

    Çok anlaşılır bir hata yapıyorsunuz - genel bir eşittir (örneğin, override def equals(a: Any)) yerine tür-kasa eşittir (yani def equals(r: Rational)) yazmaya çalışıyorsunuz. Eğer override anahtar kelime gerekmez Bunun yerine ağır basan equals --note ait

    - Tür parametreleri aşırı yüklenerek başka bir yöntemi yaratıyor ve sonra, iki yöntemleri eşittir alır birini Rational ve birine sahip Any alır. == ile aynı şey; Yalnızca Any parametreli yöntem geçersiz kılınamaz.

    Müthiş

    override def equals(a: Any) = a match { 
        case r: Rational => numer == r.numer && denom == r.demon 
        case _ => false 
    } 
    
    +0

    gibi bir şey olarak Java (ve Scala kitaplığında) ile tutarlı davranışı, sen yeniden yazmak gerekiyordu eşittir almak için. JVM topraklarına döndüğümde bu beni ısırdı. Er ya da geç öğreneceğim. Zaten bir 'eşleştir' bırakabilirim ve sadece 'eşittir' anonim bir işlev atayabilir miyim? def eşittir geçersiz: Any => Boolean = {case r: Rational/* ... * /} 'oldukça çalışmıyor ... – rampion

    +2

    @rampion - Hayır, tip imzasını tam olarak eşleştirmelisiniz. 'eşittir: Herhangi bir => Boole ', bir işlevi döndürdüğü anlamına gelir (yani' Function1 [Any, Boolean] 'sınıfının bir örneği). Bu kavramsal olarak bir anlamda eşdeğer olsa da, aynı yöntem değildir, bu yüzden işe yaramaz. –