2011-01-09 14 views
13

Estoy tratando de crear una clase de Ruby donde el método initialize toma un hash de opciones. Entonces tengo esas opciones como attr_accessor s para la clase. Ahora, podría hacer algo comoself.send (method, =, value) no funciona

class User 
    attr_accessor :name, :email, :phone 

    def initialize(options) 
    self.name = options[:name] 
    self.email = options[:email] 
    self.phone = options[:phone] 
    end 
end 

User.new(:name => 'Some Name', :email => '[email protected]', :phone => 435543093) 

pero no me parece muy SECO. En cambio, me gustaría hacer

class User 
    attr_accessor :name, :email, :phone 

    def initialize(options) 
    options.each do |option_name, option_value| 
     # Does not work!! 
     self.send(option_name, '=', option_value) 

     # Does not work either!! 
     self.send(option_name, '=' + option_value) 
    end 
    end 
end 

User.new(:name => 'Some Name', :email => '[email protected]', :phone => 435543093) 

pero no consigo que la sintaxis funcione!

¿Qué estoy haciendo mal?

Respuesta

50

Obtiene este problema porque el nombre del método es incorrecto. Cuando se utiliza un envío con un organismo, que tendrá que incluir la = en el nombre del método, así:

self.send("#{option_name}=", option_value) 

Lo anterior debe hacer el truco.

+0

Gracias! Eso tiene sentido. – raikiri

Cuestiones relacionadas