2010-10-15 26 views

cevap

6
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 
+0

Ama bunu diğer sınıfları kullanarak yapmak istersem? Ya da 100 özellik varsa? – dfens

+4

== (diğer) yönteminizde, self.instance_variables.each do | ivar | self.ivar == other.ivar son Ayrıca === bakmak isteyebilirsiniz. –

+0

benim için çalıştı, teşekkürler – dfens

8
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 
+0

Bu iyi görünüyor ancak nesneler için bu işlevselliğe ihtiyacım var, neyse, Structures – dfens

+1

@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

0

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)

1

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 
İlgili konular