programacion objetos manejo herencia ejemplos ejemplo clases clase ruby ruby-on-rails-3

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?

  1. Tengo el nombre como una cadena de la clase que quiero verificar
  2. Creo que necesito instanciar una instancia de clase para poder
  3. 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 .