gpt4 book ai didi

ruby - 带有类名的动态类定义

转载 作者:数据小太阳 更新时间:2023-10-29 06:19:43 25 4
gpt4 key购买 nike

如何在 Ruby 中使用名称动态定义类?

我知道如何动态创建一个类没有一个名字,使用类似的东西:

dynamic_class = Class.new do
def method1
end
end

但是你不能指定类名。我想 名称动态创建一个类。

这是我想做的一个例子,但当然它实际上不起作用。
(请注意,我不是在创建类的实例,而是在创建类定义)

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) # If inheriting, use Class.new( superclass )
dummy2 = eval("#{dynamic_name}")
puts "dummy2: #{dummy2}"

最佳答案

类的名称就是引用它的第一个常量的名称。

即如果我执行 myclass = Class.new,然后执行 MyClass = myclass,类的名称将变为 MyClass。但是,如果我直到运行时才知道类的名称,我就不能执行 MyClass =

因此,您可以使用 Module#const_set,它动态设置 const 的值。示例:

dynamic_name = "ClassName"
Object.const_set(dynamic_name, Class.new { def method1() 42 end })
ClassName.new.method1 #=> 42

关于ruby - 带有类名的动态类定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4113479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com