2010-11-02 22 views

risposta

25

Un modo (ce ne sono altri) è quello di utilizzare instance_variable_set e instance_variable_get come così:

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

Mi piace la tua soluzione, è pulito e mostra getter e setter. Grazie! – dhulihan

+1

Come procederesti a trasformare questo in un modulo, in modo che tu possa mescolarlo con le classi che desideri questa funzionalità? – ericso

1

forse,

instance_variable_set(name,value) 

è ciò che vostro voglia!

esempio:

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

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

si sa, classe è oggetto troppo.

0

fatto un pasticcio di rispondere @ di ericso commento/domanda in un altro commento, ecco che è in una risposta - un modulo che uso (basato sulla @ di ReeseMoore codice) per fare questo esempio set & Vars, se necessario:

# 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 
Problemi correlati