你很接近,但有一些事情发生了。首先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