68 votes

Comment convertir une chaîne en constante en Ruby?

Comment convertir la chaîne "User" en User ?

100voto

delba Points 4463
 Object.const_get("User")
 

Pas besoin d'exiger ActiveSupport.

61voto

Chris Jester-Young Points 102876

Vous pouvez utiliser la méthode Module#const_get . Exemple:

 irb(main):001:0> ARGV
=> []
irb(main):002:0> Kernel.const_get "ARGV"
=> []
 

34voto

severin Points 4781

Si ActiveSupport est chargé (par exemple dans Rails), vous pouvez utiliser

 "User".constantize
 

29voto

psyho Points 4116

Le meilleur moyen consiste à utiliser ActiveSupport's constantize:

 'User'.constantize
 

La fonction const_get du noyau fonctionne également, mais uniquement si vous n'avez pas de constantes namespaced, donc quelque chose comme ceci:

 Kernel.const_get('Foobar::User')
 

va échouer. Donc, si vous voulez une solution générique, il serait sage d'utiliser l'approche ActiveSupport:

 def my_constantize(class_name)
  unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ class_name
    raise NameError, "#{class_name.inspect} is not a valid constant name!"
  end

  Object.module_eval("::#{$1}", __FILE__, __LINE__)
end
 

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