95 votes

Obtenir la valeur d'une variable d'instance à partir de son nom

En général, comment puis-je obtenir une référence à un objet dont le nom figure dans une chaîne de caractères ?

Plus précisément, j'ai une liste de noms de paramètres (les variables membres - construites dynamiquement, de sorte que je ne peux pas m'y référer directement).

Chaque paramètre est un objet qui possède également un from_s méthode.

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

173voto

Yehuda Katz Points 18277

La façon la plus idiomatique d'y parvenir est la suivante :

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

Il n'est pas nécessaire d'utiliser + o intern Ruby s'en chargera très bien. Cependant, si vous vous retrouvez à mettre la main dans un autre objet et à en sortir son ivar, il y a de fortes chances que vous ayez rompu l'encapsulation.

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

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

Dans ce cas, si vous avez Computer.new vous seriez obligé d'utiliser instance_variable_get pour atteindre @cpus . Mais si vous faites cela, c'est probablement pour @cpus à être publique. Ce qu'il faut faire, c'est

class Computer
  attr_reader :cpus
end

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

Notez que vous pouvez rouvrir cualquier existante et transformer un ivar privé en lecteur. Puisqu'un accesseur n'est qu'une méthode, vous pouvez faire ce qui suit Computer.new(4).send(var_that_evaluates_to_cpus)

9voto

Daniel Lucraft Points 3323

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)

Cette opération renvoie la valeur de la variable d'instance @paramName

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X