我正在尝试设置一些Ruby代码,以便我可以动态定义一个新类。 我现在的代码如下所示,我认为它会起作用,但它不起作用,我有点困惑为什么不。
def define_new_class(&block)
new_class = Class.new(MyClass) do
yield
end
end
define_new_class do
attr_accessor :my_accessor_1
def initialize
puts "Hello"
end
end
任何见解将不胜感激!
你很接近,但有几件事不对劲。首先,Class.new
参数定义了新类的超类,但未定义MyClass
。其次,您实际上希望在您定义的类的上下文中评估块,而不仅仅是屈服于该块 - 因此instance_eval
def define_new_class(&block)
new_class = Class.new do
self.instance_eval &block
end
end
a = define_new_class do
attr_accessor :my_accessor_1
def initialize
puts "Hello"
end
end
我的猜测是,您首先MyClass
的原因是您希望生成的类可引用为MyClass
如果是这种情况,您可以执行以下操作
Object.const_set('MyClass', a)
所以在一个大的快乐方法中:
def define_new_class(name, &block)
new_class = Class.new do
self.instance_eval &block
end
Object.const_set(name, new_class)
end
define_new_class('MyClass') do
attr_accessor :my_accessor_1
def initialize
puts "Hello"
end
end
a = MyClass.new #=> #<MyClass:0x007f8baaaf72c8>
a.my_accessor_1 = 1 #=> 1
a.my_accessor_1 # => 1