如何在没有元编程的情况下优雅地比较几个类的实例变量?

时间:2016-03-17 13:56:18

标签: ruby instance-variables

我有两个不同类的实例。这些类具有相同数量的实例变量,我需要检查不同类的这些实例是否具有特定的相等实例变量。

可以通过attr_reader获取这些实例变量。

我找到了一种方法,但它很脏。有没有办法让它更清洁(没有元编程)?

[:attr_1, :attr2].all?{ |attr| a.public_send(attr) == b.public_send(attr)) }

1 个答案:

答案 0 :(得分:0)

让我们说你有这个课程:

class MyClass
  attr_accessor :a, :b, :c
  def initialize(a, b, c)
    @a, @b, @c = a, b, c
  end
end

这两个例子:

foo = MyClass.new(1, 2, 3)
bar = MyClass.new(1, 2, 3)

您可以逐个比较属性:

foo.a == bar.a && foo.b == bar.b && foo.c == bar.c #=> true

或者在数组的帮助下:(数组按元素比较)

[foo.a, foo.b, foo.c] == [bar.a, bar.b, bar.c] #=> true

或者您可以extend使用自定义模块公开您感兴趣的属性的实例:

module AttributesMethod
  def attributes
    { a: a, b: b, c: c }
  end
end

foo.extend(AttributesMethod)
bar.extend(AttributesMethod)

foo.attributes #=> {:a=>1, :b=>2, :c=>3}
bar.attributes #=> {:a=>1, :b=>2, :c=>3}

这允许你写:

foo.attributes == bar.attributes #=> true