SORU
23 AĞUSTOS 2011, Salı


Ne'eşit arasındaki fark, eql?, = = = ==?

Bu dört yöntem arasındaki farkı anlamaya çalışıyorum. == Her iki işlenen aynı nesne için başvurduğunuzda, true değerini döndürür hangi yöntemi equal? çağıran varsayılan olarak biliyorum.

Varsayılan olarak === equal?... Eğer tüm bu üç yöntem geçersiz değilse Tamam, o zaman sanırım çağıran == aramalar ===, == equal? tam olarak aynı şeyi yapmak?

Şimdi eql? gelir. (Varsayılan) ne işe yarar bu? İşlenen bu karma/ıd için bir çağrı yapar mı?

Neden Ruby çok eşitlik işaretleri var mı? Semantik farklılık mı gerekiyor?

CEVAP
23 AĞUSTOS 2011, Salı


Bazı büyük açıklamalar olduğunu düşünüyorum çünkü ağır the Object documentation burada alıntı yapacağım. Diğer sınıflar String gibi geçersiz olarak okumanı tavsiye ederim. ayrıca da bu yöntemler için belgelere bakın.

Yan Not: Eğer bu farklı nesneleri kendiniz için denemek istiyorsanız, bu gibi bir şey kullanın

class Object
  def all_equals(o)
    ops = [:==, :===, :eql?, :equal?]
    Hash[ops.map(&:to_s).zip(ops.map {|s| send(s, o) })]
  end
end

"a".all_equals "a" # => {"=="=>true, "==="=>true, "eql?"=>true, "equal?"=>false}

== genel "" . eşitlik

Nesne düzeyi, == obj other aynı nesne ise true değerini döndürür. Tipik olarak, bu yöntem, alt sınıflardan sınıf-belirli bir anlam sağlamak için geçersiz kılınır.

Bu en yaygın karşılaştırma ve (a sınıfı yazarı olarak) eğer iki nesne "" veya değil. eşit olması durumunda karar almak en temel yeri dolayısıyla.

=== — durum eşitlik

Sınıf için bir Nesne, etkin #== ama genellikle torunları tarafından geçersiz kılınmış durumda anlamlı semantik sağlamak için arayıp aynı ifadeleri.

Bu son derece yararlıdır. === ilginç olan şeyleri örnek uygulamalar:

  • Aralığı
  • Normal ifade
  • Proc (Ruby 1.9)

Gibi şeyler yapabilirsiniz:

case some_object
when /a regex/
  # The regex matches
when 2..4
  # some_object is in the range 2..4
when lambda {|x| some_crazy_custom_predicate }
  # the lambda returned true
end

21* Regex *kod çok daha temiz hale nasıl düzgün bir örnek için my answer here bkz. === kendi uygulanmasını sağlayarak, tabii ki, özel case anlambilim alabilirsiniz.

eql?Hash eşitlik

eql? yöntemi obj other aynı hash anahtarı başvurmak durumunda true değerini döndürür. Bu Hash eşitlik üyeleri test etmek için kullanılır.Sınıf nesneleri için *31, eql?* == ile eş anlamlıdır.Alt normal ** 35 geçersiz kılınmış yöntemi eql? aliasing ile bu geleneği devam, ama istisnalar vardır. Numeric türleri, örneğin, eql?, arasında 37 ** ama o kadar değil: türü arasında dönüşüm gerçekleştirir

1 == 1.0     #=> true
1.eql? 1.0   #=> false

Kendi yararı için bu geçersiz kılma olabilirsiniz, veya == geçersiz alias :eql? :== bu iki yöntem de aynı şekilde davranır kullanabilirsiniz.

equal? — kimlik karşılaştırması

Aksine == equal? yöntem asla geçersiz tarafından alt: bunu belirlemek için kullanılır nesne kimlik (a.equal?(b) ıff a aynı nesne olarak b).

Bu etkili bir şekilde karşılaştırma göstericidir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Paste Magazine

    Paste Magazi

    28 AĞUSTOS 2008
  • RyanXLT

    RyanXLT

    22 Ocak 2011
  • TantalizingTrance

    TantalizingT

    15 ŞUBAT 2009