使用类名称的动态类定义 [英] Dynamic Class Definition WITH a Class Name
问题描述
如何在Ruby中动态定义类名称?
我知道如何动态创建类 使用类似的名称:
I know how to create a class dynamically without a name using something like:
dynamic_class = Class.new do
def method1
end
end
但不能指定类名。我想动态创建一个类与一个名称。
But you can't specify a class name. I want to create a class dynamically with a name.
这里是我想做的一个例子,但实际上并不工作。
(注意,我不是创建一个实例的类,但是类定义)
Here's an example of what I want to do but of course it doesn't actually work.
(Note that I am not creating an instance of a class but a class definition)
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
实际输出:
dummy: TestEval
dummy2:
所需输出:
dummy: TestEval
dummy2: TestEval2
============================================== ======
======================================================
答案:使用sepp2k方法的完全动态解决方案
dynamic_name = "TestEval2"
Object.const_set(dynamic_name, Class.new)
dummy2 = eval("#{dynamic_name}")
puts "dummy2: #{dummy2}"
推荐答案
类的名称只是引用它的第一个常量的名称。
The name of a class is simply the name of the first constant that refers to it.
Ie如果我做 myclass = Class.new
,然后 MyClass = myclass
,类的名称将变为 MyClass
。但是如果我不知道类的名称,直到运行时,我不能做 MyClass =
。
I.e. if I do myclass = Class.new
and then MyClass = myclass
, the name of the class will become MyClass
. However I can't do MyClass =
if I don't know the name of the class until runtime.
所以,你可以使用 Module#const_set
,它动态设置一个const的值。示例:
So instead you can use Module#const_set
, which dynamically sets the value of a const. Example:
dynamic_name = "ClassName"
Object.const_set(dynamic_name, Class.new { def method1() 42 end })
ClassName.new.method1 #=> 42
这篇关于使用类名称的动态类定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!