Set Attribute Dynamically of Ruby Object

后端 未结 4 835
一向
一向 2020-12-05 12:49

How can I set an object attribute dynamically in Ruby e.g.

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


        
相关标签:
4条回答
  • 2020-12-05 13:16

    This answer (https://stackoverflow.com/a/7466385/6094965) worked for me:

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

    attribute has to be a String. So if you are iterating trough an array of Symbols (like me), you can use to_s.

    Object.send(attribute.to_s + '=', value) 
    
    0 讨论(0)
  • 2020-12-05 13:21

    Use send:

    def set_property(obj, prop_name, prop_value)
        obj.send("#{prop_name}=",prop_value)
    end
    
    0 讨论(0)
  • 2020-12-05 13:25

    If circumstances allow for an instance method, the following is not overly offensive:

    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
    

    Usage:

    p = P00t.new
    p.set_property('w00t', 'jeremy')
    
    0 讨论(0)
  • 2020-12-05 13:30

    Object#instance_variable_set() is what you are looking for, and is the cleaner version of what you wanted.

    Example:

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

    Ruby documentation about Object#instance_variable_set

    0 讨论(0)
提交回复
热议问题