考虑一下:
class Aaa
attr_accessor :a, :b
end
x = Aaa.new
x.a, x.b = 1,2
y = Aaa.new
y.a, y.b = 1,2
puts x == y #=>false
有没有办法检查所有公共属性在相同类型的类中是否相等?
答案 0 :(得分: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?
和hash
,以便两个Aaa
相等,如果它们的值为a
}和b
是平等的。它还定义了initialize
,以便您在创建对象(a
)时可以选择传递b
和Aaa.new(value_for_a, value_for_b)
的值。它定义to_a
以返回[a,b]
。
您还可以将Struct.new
与块一起使用来定义其他方法,这样您就拥有了“普通”类的全部功能:
Aaa = Struct.new(:a, :b) do
def c
a+b
end
end
Aaa.new(23,42).c #=> 65
答案 1 :(得分:7)
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
答案 2 :(得分:1)
我们可以很容易地推广到任意数量的实例,并删除实例变量的getter要求:
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
将z
更改为:
z = Aaa.new(1,2,4)
然后:
x.instance_variables.map do |v|
arr.map { |i| i.send(:instance_variable_get,v) }.uniq.size == 1
end.all?
#=> false
答案 3 :(得分:0)
处理Ruby中比较对象的额外方法包括使用hash
。出于性能原因,当类很大时,最好使用hash
来比较ruby对象:
def intialize(value_a,value_b) @a = value_a @b = value_b 结束
def hash(目标) @ a.hash == target.a.hash&& @ b.hash == target.b.hash 结束 端
A =新Aaa('无论','何时') B =新Aaa('然而','谁') A.hash(B)