通过带方法的方法定义新类

时间:2014-04-26 17:32:28

标签: ruby metaprogramming

我有一个定义并返回一个新类的函数,带有一些预构建的方法。 E.g:

def define_class(name, options={}, &block)
  klass = Class.new(Class) do

    def say_hello
      puts "Hello!"
    end

    def say_goodbye
      puts "Adios!"
    end
  end

  parent_class.const_set(form_class, klass)
  klass
end

因此,例如,这有效:

define_class("testing").new.say_hello   #=> "Hello!"

但我希望能够通过一个块传递自定义方法,然后将其添加到我的类中,如下所示:

define_class "testing" do
  # ... custom methods
end

这样可行:

klass = define_class "testing" do
  def interject
    puts "Excuse me?"
  end
end
klass.new.interject #=> "Excuse me?"

我无法弄清楚如何做这项工作;我已经尝试过instance_eval,class_eval和yield,但没有一个产生所需的结果。

1 个答案:

答案 0 :(得分:2)

尝试简单:

def define_class(name, options={}, &block)
  klass = Class.new(&block)

  parent_class.const_set(form_class, klass)
  klass
end

如果您想调用块您自己的块,您应该使用class_eval

def define_class(name, options={}, &block)
  klass = Class.new do

    def say_hello
      puts "Hello!"
    end

    def say_goodbye
      puts "Adios!"
    end

    class_eval(&block)
  end

  parent_class.const_set(form_class, klass)
  klass
end