Ruby 通过 proc 动态定义一个新类



我正在尝试设置一些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

最新更新