Вот пример того, как методы Object # instance_variable_set и Object # instance_variable_get могут использоваться для увеличения значений всех переменных экземпляра на единицу.
class Klass
attr_accessor :a, :b, :cat
def initialize
@a, @b, @c, @d = 1, 2, 3, 4
end
end
k = Klass.new
#=> #<Klass:0x0000000001d70978 @a=1, @b=2, @c=3, @cat=4>
k.instance_variables.each { |v| k.instance_variable_set(v, k.instance_variable_get(v)+1) }
#=> [:@a, :@b, :@c, :@cat]
k #=> #<Klass:0x0000000001d70978 @a=2, @b=3, @c=4, @cat=5>
См. Также Object # instance_variables .
По сравнению с четырьмя отдельными операторами присваивания требуется меньше строк кода, но есть два других, более важных преимущества:
- меньше шансов внести ошибку (
k.cut += 1
);и - добавление, удаление или переименование переменных экземпляра не требует изменения кода приращения значения.
Вариант этого состоит в замене динамически созданного массива переменной экземпляра.имена (например, [:@a, :@b]
) для instance_variables
выше.
Это может показаться необычным примером, но они представляют большой класс операций с переменными экземпляра, в которых может использоваться этот тип пакетной обработкик преимуществу.