¿Cómo se define dinámicamente una clase en Ruby WITH a name?Definición de clase dinámica CON nombre de clase
sé cómo crear una clase dinámica sin un nombre usando algo como:
dynamic_class = Class.new do
def method1
end
end
pero no se puede especificar un nombre de clase. Quiero crear una clase dinámicamente con un nombre.
Aquí hay un ejemplo de lo que quiero hacer pero, por supuesto, en realidad no funciona.
(Nótese que no estoy creando una instancia de una clase, sino una definición de clase)
class TestEval
def method1
puts "name: #{self.name}"
end
end
class_name = "TestEval"
dummy = eval("#{class_name}")
puts "dummy: #{dummy}"
dynamic_name = "TestEval2"
class_string = """
class #{dynamic_name}
def method1
end
end
"""
dummy2 = eval(class_string)
puts "dummy2: #{dummy2}" # doesn't work
salida real:
dummy: TestEval
dummy2:
salida deseada:
dummy: TestEval
dummy2: TestEval2
==== ===============================================
Respuesta: método
dynamic_name = "TestEval2"
Object.const_set(dynamic_name, Class.new)
dummy2 = eval("#{dynamic_name}")
puts "dummy2: #{dummy2}"
Realmente no consigo lo que quiere lograr. Hay una clase TestEval2, puedes hacer test_eval2 = TestEval2.new después. Y: clase A ... final siempre produce nulo, por lo que su salida está bien, supongo ;-) – Philip
Es para un paso de prueba TDD. Necesito crear una clase de prueba dinámicamente y luego hacer referencia a su nombre porque así es como se usará en la naturaleza. sepp2K lo hizo bien. –
@Philip: 'clase A ... fin' no * evalúa como' nil', evalúa el valor de la última expresión evaluada dentro de él, como cualquier otra expresión compuesta (bloques, métodos, definiciones de módulos, expresión grupos) en Ruby. Sucede que en muchos cuerpos de definición de clase, la última expresión es una expresión de definición de método, que se evalúa como 'nil'. Pero a veces es útil tener un cuerpo de definición de clase evaluado a un valor específico, p. en el 'clase << uno mismo; lenguaje autofinal. –