2009-03-07 16 views
19

Indipendentemente dal fatto che si tratti di buone pratiche o meno, come posso chiamare dinamicamente i metodi di accesso in Ruby?Come chiamare dinamicamente i metodi di accesso in Ruby

Ecco un esempio di classe:

class Test_Class 
    attr_accessor :a, :b 
end 

posso utilizzare il metodo Object.send per leggere la variabile ...

instance.a = "value" 
puts(instance.send("a")) 
# => value 

ma sto avendo un momento difficile cercando di scrivere a esso. Questi due "numero errato di argomenti (1 per 0) (ArgumentError)"

instance.send("a", "value") 

e

instance.method("a").call("value") 

Please help me StackOverflow!

risposta

44

Io non sono un esperto di rubino, ma penso che si possa fare:

instance.send("a=", "value") 
+0

Works, grande! Immagino che il segno di uguale faccia parte del nome del metodo? –

+0

Sì, gli uguali firmano nel modo convenzionale per definire i metodi setter in Ruby. Vorrei usare un simbolo piuttosto che una stringa. 'instance.send (: a =," value ")' –

+0

Sì. attr_accessor effettua due metodi: def v; @v; fine e def v = (valore); @ V = valore; fine – Angela

9

È possibile anche accedere direttamente le variabili di un oggetto istanza utilizzando instance_variable_* funzioni:

instance = Test_Class.new     # => #<Test_Class:0x12b3b84> 

# instance variables are lazily created after first use of setter, 
# so for now instance variables list is empty: 
instance.instance_variables    # => [] 

instance.instance_variable_set(:@a, 123) # => 123 
instance.a         # => 123 
instance.instance_variables    # => ["@a"] 
instance.instance_variable_get("@a")  # => 123 
Problemi correlati