2012-04-24 5 views
0

J'ai regardé haut et bas et peut-être que je suis juste un peu hors de la pratique mais je n'arrive pas à trouver comment faire ce qui suit. J'ai une chaîne/symbole, par exemple "a" ou :a. La classe, B, contient un membre de données, @a. Je cherche à accéder au membre de cette façon:Accès membre par chaîne dans Ruby?

def method object_of_class_B, string_or_symbol_referencing_the_member 
    object_of_class_B.some_other_method string_or_symbol_referencing_the_member = 010 
end 

donc je peux appeler:

method c, :a 

et ont le même effet que si je l'avais écrit:

c.a = 010 

Can Quelqu'un me pointe-t-il dans la direction d'une solution? Est-ce que j'ai complètement raté une pièce clé de Ruby dans mon apprentissage?

Répondre

4

Vous pouvez utiliser send pour appeler la méthode setter comme ceci:

object_of_class_B.send("#{ string_or_symbol_referencing_the_member }=", 010) 
1

Si l'objet n'a pas déjà un accesseur pour l'attribut, vous pouvez utiliser instance_variable_set sur l'objet.

Par exemple:

c = SomeClass.new 
c.instance_variable_set(:@a, 'new value') 
+0

Cela n'a que le même effet que l'appel 'C.Un = « nouveau value'' si le '' a = méthode définit l'instance variable '@ et ne fait rien a' autre. Si 'c' est, par exemple, un objet enregistrement actif, l'utilisation de instance_variable_set n'aura pas l'effet désiré. – sepp2k

+0

Bien qu'à la réflexion, l'OP a dit qu'il avait une variable d'instance @a. Donc, peu importe ... – sepp2k

+0

Vous avez raison. @xuinkrbin devrait être familier avec la classe avec laquelle il «tripote». – Jamie