Подтвердить что ты не робот

Установить атрибут динамически с объекта Ruby

Как настроить динамический атрибут объекта в Ruby, например.

def set_property(obj, prop_name, prop_value)
    #need to do something like > obj.prop_name = prop_value 

    #we can use eval but I'll prefer a faster/cleaner alternative:
    eval "obj.#{prop_name} = #{prop_value}"
end
4b9b3361

Ответ 1

Используйте send:

def set_property(obj, prop_name, prop_value)
    obj.send("#{prop_name}=",prop_value)
end

Ответ 2

Object#instance_variable_set() - это то, что вы ищете, и является более чистой версией того, что вы хотели.

Пример:

your_object = Object.new
your_object.instance_variable_set(:@attribute, 'value')
your_object
# => <Object:0x007fabda110408 @attribute="value">

Документация Ruby о Object#instance_variable_set

Ответ 3

Если обстоятельства допускают метод экземпляра, следующее не слишком оскорбительно:

class P00t
  attr_reader :w00t

  def set_property(name, value)
    prop_name = "@#{name}".to_sym # you need the property name, prefixed with a '@', as a symbol
    self.instance_variable_set(prop_name, value)
  end
end

Использование:

p = P00t.new
p.set_property('w00t', 'jeremy')

Ответ 4

Этот ответ (fooobar.com/info/179992/...) работал у меня:

Object.send(атрибут + '=', значение)

"атрибут" должен быть строкой. Поэтому, если вы повторяете массив символов (например, я), вы можете использовать "to_s".

Object.send(attribute.to_s + '=', value)