2010-03-02 11 views
53

Cómo convertir la cadena a User?¿Cómo convertir una cadena a una constante en Ruby?

+0

¿Está intentando llamar a una función variable? – harbichidian

+1

También me gustaría una respuesta a esta pregunta; sin embargo, ¿está tratando de crear una nueva constante basada en una cadena, O encuentra una constante ya inicializada? ¿También buscas rubíes vainilla o también rieles? – onebree

Respuesta

61

Puede usar el método Module#const_get. Ejemplo:

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

Si tiene ActiveSupport carga (por ejemplo, en los carriles) que puede utilizar

"User".constantize 
22

El método recomendado es utilizar constantize de ActiveSupport:

'User'.constantize 

También puede usar el kernel de const_get, pero en Ruby < 2.0, no admite constantes de espacio de nombres, por lo que algo como esto:

Kernel.const_get('Foobar::User') 

fallarán en Ruby < 2.0. Así que si quieres una solución genérica, lo mejor será utilizar el enfoque 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 
+8

const_get funciona también para las constantes de espacio de nombres desde ruby ​​2.0 – untidyhair

+0

Dado que Ruby 2.0 ha alcanzado la EOL, ya no es necesario recurrir a ActiveSupport como una dependencia para hacer referencia a una constante con una cadena. :-) – Drenmi

+0

Consulte también ''User'.safe_constantize' –

75
Object.const_get("User") 

No hay necesidad de requerir ActiveSupport.

+40

+1 enfermo de active_support contaminando preguntas generales de ruby. –

-3

Uso rubí método mágico: eval():

eval("User") #=> User 
+4

Esto es probablemente una exageración completa, ya que 'eval' no debe usarse así, y se deben evitar por completo las alternativas más específicas. – yagooar

Cuestiones relacionadas