2010-11-02 33 views

Respuesta

25

Una forma (hay otros) es utilizar instance_variable_set y instance_variable_get como tan:

class Test 
    def create_method(name, &block) 
     self.class.send(:define_method, name, &block) 
    end 

    def create_attr(name) 
     create_method("#{name}=".to_sym) { |val| 
      instance_variable_set("@" + name, val) 
     } 

     create_method(name.to_sym) { 
      instance_variable_get("@" + name) 
     } 
    end 
end 

t = Test.new 
t.create_attr("bob") 
t.bob = "hello" 
puts t.bob 
+1

Me gusta su solución, es limpia y muestra un getter y setter. ¡Gracias! – dhulihan

+1

¿Cómo harías para convertir esto en un módulo, para que puedas mezclarlo con las clases en las que quieres esta funcionalidad? – ericso

1

tal vez,

instance_variable_set(name,value) 

es lo que tu quieres!

por ejemplo:

class Mclass 
    def show_variables 
    puts self.class.instance_variables 
    end 
end 

Mclass.instance_variable_set(:@test,1) 
o=Mclass.new 
o.show_variables 

usted sabe, la clase es objeto también.

0

hecho un lío de responder de @ Ericso comentario/pregunta en otro comentario, por lo que aquí está en una respuesta - un módulo que utilizo (basado en el código de @ ReeseMoore) para hacer esta instancia conjunto & vars, si es necesario:

# adds ability to dynamically create instance vars & attr_accessors 
module Attributable 
    def create_method(name, &block) 
    self.class.send(:define_method, name.to_sym, &block) 
    end 

    def create_setter(m) 
    create_method("#{m}=".to_sym) { |v| instance_variable_set("@#{m}", v) } 
    end 

    def create_getter(m) 
    create_method(m.to_sym) { instance_variable_get("@#{m}") } 
    end 

    def set_attr(method, value) 
    create_setter method 
    send "#{method}=".to_sym, value 
    create_getter method 
    end 
end 
Cuestiones relacionadas