【问题标题】:Defining new class through method with block通过带有块的方法定义新类
【发布时间】:2014-04-26 17:32:28
【问题描述】:

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

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,但都没有产生预期的结果。

【问题讨论】:

    标签: ruby metaprogramming


    【解决方案1】:

    简单尝试:

    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
    

    【讨论】:

    • Uri - 我遇到的问题是我不仅需要块中定义的函数,还需要其他预定义的函数(例如def say_hello)。我怎样才能让两者一起工作?
    • 尝试使用您的代码,然后在您的块中调用class_eval(&block)
    • 啊,成功了!我之前尝试过,但忘记传入带有 '&' 符号的 blcok,并且不断收到类型错误!
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多