bu düşünün? a
ve b
için değerleri eşitse iki Aaa
s, eşit olacak şekildekarşılaştırılması nesneler
cevap
class Aaa
attr_accessor :a, :b
def ==(other)
return self.a == other.a && self.b == other.b
end
end
x = Aaa.new
x.a,x.b = 1,2
y = Aaa.new
y.a,y.b = 1,2
y = Aaa.new
y.a,y.b = 1,2
z = Aaa.new
z.a,z.b = 1,3
x == y # => true
x == z # => false
Aaa = Struct.new(:a, :b)
x = Aaa.new
x.a, x.b = 1,2
y = Aaa.new
y.a, y.b = 1,2
x == y #=> true
Struct
, ==
, eql?
ve sizin için hash
tanımlar. Ayrıca,ve b
için nesneyi (Aaa.new(value_for_a, value_for_b)
) oluştururken isteğe bağlı olarak değerleri iletebilmeniz için initialize
'u tanımlar. Ve [a,b]
dönmek için to_a
tanımlar.
Eğer "normal" bir sınıfın tam güce sahibiz böylece de ek yöntemlerini tanımlamak için bir blokla Struct.new
kullanabilirsiniz:
Aaa = Struct.new(:a, :b) do
def c
a+b
end
end
Aaa.new(23,42).C#=> 65
Bu iyi görünüyor ancak nesneler için bu işlevselliğe ihtiyacım var, neyse, Structures – dfens
@dfens hakkında bilmediğim güzel yanıt: Nesneler bunlar. Struct.new, yalnızca sınıflar için bir fabrika yöntemidir. 'Aaa' 'class' anahtar sözcüğünü kullanarak tanımladıysanız ve daha sonra '==' vs. kendiniz tanımladıysanız aynı davranışı alırsınız. – sepp2k
Ekstra yöntemi Ruby nesneleri karşılaştırarak oluşur başa hash
kullanımında.
sınıf Aaa attr_accessor: a:
def başlatılamadığı b (value_a, value_b) @a sınıfı büyük olduğunda performans nedenle, en iyisi yakut şekilde nesneleri karşılaştırmak için hash
kullanmaktır = value_a b'yi = value_b uç
def karma (hedef) a.hash == b.hash @ target.a.hash & & == target.b.hash uç ucu @
A = Yeni Aaa ('ne', 'zaman') B = Yeni Aaa ('Bununla birlikte', 'kim') A.hash (B)
Kolayca örneklerde herhangi bir sayıda genelleyebilir ve örnek değişkenleri için alıcılar gereksinimini damla:
class Aaa
def initialize(a,b,c)
@a, @b, @c = a, b, c
end
end
x = Aaa.new(1,2,3)
y = Aaa.new(1,2,3)
z = Aaa.new(1,2,3)
arr = [x,y,z]
x.instance_variables.map do |v|
arr.map { |i| i.send(:instance_variable_get,v) }.uniq.size == 1
end.all?
#=>true
Değişim z
için:
z = Aaa.new(1,2,4)
sonra:
x.instance_variables.map do |v|
arr.map { |i| i.send(:instance_variable_get,v) }.uniq.size == 1
end.all?
#=> false
- 1. Boolean'larla ArrayLists Karşılaştırılması
- 2. karşılaştırılması DNA dizileri 3
- 3. Android'de Bitmap görüntülerinin karşılaştırılması
- 4. GenericType Arabirimlerin Karşılaştırılması
- 5. Lisp'deki listelerin karşılaştırılması
- 6. Farklı şekillerdeki matrislerin karşılaştırılması
- 7. upper_bound/lower_bound işlevinin karşılaştırılması
- 8. karşılaştırılması telefon numaraları Android
- 9. Listeler arasındaki bigramların karşılaştırılması
- 10. FPGA'nın ASIC tasarımı ile karşılaştırılması
- 11. Python ve R sözcüklerinin karşılaştırılması
- 12. 2 tarihin momentJS ile karşılaştırılması
- 13. İki matris arasındaki satırların karşılaştırılması
- 14. Bir sayfa veya denetleyicinin karşılaştırılması
- 15. Yücelteki sayı ve sayıların karşılaştırılması
- 16. SQL - Bir tablodaki tarihlerin karşılaştırılması
- 17. Ayrı .txt dosyalarındaki sütunların karşılaştırılması
- 18. ayıklanıyor nesneler
- 19. sabit nesneler
- 20. ekleme nesneler
- 21. Tüm Diziye Tek Bir Değerin Karşılaştırılması? (C#)
- 22. İki Joda-Time DateTime nesnesinin karşılaştırılması
- 23. cypher/neo4j ile dizi değerlerinin karşılaştırılması
- 24. Bir NSDate öğesinin [NSDate date] ile karşılaştırılması
- 25. Öğelerin ikisi arasındaki öğelerin karşılaştırılması Öğeleri
- 26. karşılaştırılması diziler içerik, SequenceEqual ve StructuralComparisons.StructuralEqualityComparer
- 27. Microsoft Access'te tarih/saat değerlerinin karşılaştırılması
- 28. Alaşım - birinci dereceden mantık ile karşılaştırılması
- 29. IntelliJ Python eklentisinin veya PyCharm'ın karşılaştırılması
- 30. Eski dosyaları denetlemek için tarihlerin karşılaştırılması
Ama bunu diğer sınıfları kullanarak yapmak istersem? Ya da 100 özellik varsa? – dfens
== (diğer) yönteminizde, self.instance_variables.each do | ivar | self.ivar == other.ivar son Ayrıca === bakmak isteyebilirsiniz. –
benim için çalıştı, teşekkürler – dfens