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
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öntemiobj
other
aynı hash anahtarı başvurmak durumunda true değerini döndürür. BuHash
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öntemieql?
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ştirir1 == 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)
ıffa
aynı nesne olarakb
).
Bu etkili bir şekilde karşılaştırma göstericidir.
'eq, eql arasındaki fark ne, eşit...
Devlet, ST arasındaki fark, İORef ve M...
Eşit taraflar arasında fark/eşit ve ==...
Polimer elemanları ve AngularJS direkt...
'temp tablo arasındaki fark ne ve...