objetos - ¿Cómo creo una instancia de clase a partir de un nombre de cadena en ruby?
manejo de objetos en ruby (4)
En rieles puedes hacer:
clazz = ''ExampleClass''.constantize
En rubí puro:
clazz = Object.const_get(''ExampleClass'')
con módulos:
module Foo
class Bar
end
end
usarías
> clazz = ''Foo::Bar''.split(''::'').inject(Object) {|o,c| o.const_get c}
=> Foo::Bar
> clazz.new
=> #<Foo::Bar:0x0000010110a4f8>
Tengo el nombre de una clase y quiero crear una instancia de esa clase para poder recorrer cada atributo de rieles que está presente en el esquema de esa clase.
¿Cómo voy a hacer eso?
- Tengo el nombre como una cadena de la clase que quiero verificar
- Creo que necesito instanciar una instancia de clase para poder
- Recorra sus atributos e imprímalos.
Muy simple en Rails: use String#constantize
class_name = "MyClass"
instance = class_name.constantize.new
Prueba esto:
Kernel.const_get("MyClass").new
Luego, recorrer las variables de instancia de un objeto:
obj.instance_variables.each do |v|
# do something
end
module One
module Two
class Three
def say_hi
puts "say hi"
end
end
end
end
one = Object.const_get "One"
puts one.class # => Module
three = One::Two.const_get "Three"
puts three.class # => Class
three.new.say_hi # => "say hi"
En ruby 2.0 y, posiblemente, versiones anteriores, Object.const_get
realizará de forma recursiva una búsqueda en espacios de nombres como Foo::Bar
. El ejemplo anterior es cuando el espacio de nombre se conoce antes de tiempo y resalta el hecho de que se puede const_get
en módulos directamente en oposición a exclusivamente en Object
.