2016-01-19 2 views
1

Так что, если этот код:проверить, если массив включает в себя экземпляр с определенным значением для экземпляра переменного рубина

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?, но где вместо проверки экземпляра определенного класса он также проверяет переменные экземпляра этого класса?

+0

Есть взгляд на [Override == оператора в Рубине] (http://stackoverflow.com/questions/ 11186815/override-operator-in-ruby) –

ответ

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

Вы можете просто обратиться к переменной экземпляра.

> 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

+0

Вы * можете * использовать 'instance_variable_get', но определенно не должны. Переменные экземпляра являются частными по дизайну. Если вы хотите, чтобы их ценность была общедоступной, для этого нужны 'attr_reader' или' attr_accessor'. –

+0

@ Иордан, это правда, но если вопрос берется буквально, это единственный способ. –

Смежные вопросы