检查数组是否包含具有实例变量Ruby

时间:2016-01-19 20:12:02

标签: arrays ruby

所以如果有这个代码:

class A
    def initialize(type)
        @type = type
    end
end

instance = A.new(2)
another_instance = A.new(1)

array = [instance, another_instance]

有没有办法检查array是否包含A @type等于某个值的实例?说,2?像include?方法,但它不是检查某个类的实例,而是检查该类的实例变量?

2 个答案:

答案 0 :(得分:2)

我建议您使用attr_reader,除非您打算在之后的某处修改type(在这种情况下使用attr_accessor,这既是作家又是读者)

class A
  attr_reader :type
  def initialize(type)
    @type = type
  end
end
instance = A.new(2)
another_instance = A.new(1)

array = [instance, another_instance]

array.select do |item|
  item.type == 2
end
=>[#<A:0x00000000dc3ea8 @type=2>]

我在这里迭代A的一系列实例,只选择满足条件的item.type == 2

答案 1 :(得分:1)

您只需引用实例变量即可。

> array.any? { |item| item.is_a?(A) }
=> true
> array.any? { |item| item.instance_variable_get(:@type) == 1 }
=> true
> array.select { |item| item.instance_variable_get(:@type) == 1 }
=> [#<A:0x007fba7a12c6b8 @type=1>]

或者,在课堂上使用attr_accessor,以便更轻松

class A
  attr_accessor :type
  def initialize(type)
    @type = type
  end
end

然后你可以something = A.new(5); something.type