Récupère la valeur d’une variable d’instance en fonction de son nom

En général, comment puis-je obtenir une référence à un object dont le nom est dans une chaîne?

Plus précisément, j’ai une liste des noms de parameters (les variables membres – construites dynamicment, donc je ne peux pas les consulter directement).

Chaque paramètre est un object qui a également une méthode from_s .

Je veux faire quelque chose comme ce qui suit (qui, bien sûr, ne fonctionne pas …):

 define_method(:from_s) do | arg | @ordered_parameter_names.each do | param | instance_eval "field_ref = @#{param}" field_ref.from_s(param) end end 

Le moyen le plus idiomatique pour y parvenir est:

 some_object.instance_variable_get("@#{name}") 

Il n’y a pas besoin d’utiliser + ou intern ; Ruby va gérer cela très bien. Cependant, si vous vous retrouvez à toucher un autre object et à sortir son ivar, il y a de bonnes chances que vous ayez cassé l’encapsulation.

Si vous voulez explicitement accéder à un ivar, la bonne chose à faire est d’en faire un accesseur. Considérer ce qui suit:

 class Computer def new(cpus) @cpus = cpus end end 

Dans ce cas, si vous avez utilisé Computer.new , vous serez obligé d’utiliser instance_variable_get pour accéder à @cpus . Mais si vous faites cela, vous voulez probablement dire que @cpus est public. Ce que vous devez faire, c’est:

 class Computer attr_reader :cpus end 

Maintenant, vous pouvez faire Computer.new(4).cpus .

Notez que vous pouvez rouvrir toute classe existante et créer un ivar privé dans un lecteur. Comme un accesseur est juste une méthode, vous pouvez faire Computer.new(4).send(var_that_evaluates_to_cpus)

Pour obtenir une variable d’instance à partir du nom d’une variable d’instance, procédez comme suit:

 name = "paramName" instance_variable_get(("@" + name).intern) 

Cela retournera la valeur de la variable d’instance @paramName