Ruby类估值与收益率

Ruby类估值与收益率,ruby,Ruby,老兄,我今天正在剥洋葱皮,不管怎样,代码是这样的 class MyClass def initialize(dynamic_methods) @arr = Array.new(dynamic_methods) @arr.each { |m| self.class.class_eval do define_method(m) do "<#{yield self if block_given?}>" e

老兄,我今天正在剥洋葱皮,不管怎样,代码是这样的

class MyClass
  def initialize(dynamic_methods)
    @arr = Array.new(dynamic_methods)
    @arr.each { |m|
      self.class.class_eval do
        define_method(m) do
          "<#{yield self if block_given?}>" 
        end
      end
    }
    end
end

tmp = MyClass.new ['method1', 'method2', 'method3']
tmp.method1 do |t|
  "here"
end
有人能帮我解释一下语法吗?提前感谢你的帮助

更新:请参阅下面的答案。尝试更换

define_method(m) do
  "<#{yield self if block_given?}>" 
end

在Sergei的大量反馈和我自己的一些修补之后,我成功地让它工作起来

class MyClass
  def initialize(dynamic_methods)
    @arr = Array.new(dynamic_methods)
    @arr.each { |m|
      self.class.module_eval %Q{
        def #{m}(&block)
          yield(self) if block_given?
        end
      end
    }
    end
end

tmp = MyClass.new ['method1', 'method2', 'method3']
tmp.method1 do |t|
  "here"
end

正如您所知,Sergei的建议有一些小的调整,因此感谢您对Sergei的帮助。

很遗憾,您是对的,我在1.8.6上,它在&block上出现了barfed(语法错误)。在这种情况下,您可能会屈服于
module_eval
,它需要一个字符串:module_eval%Q{def#{m}(&block)”end}很抱歉,这也导致了一个错误,这次是“未定义的局部变量或方法'block'”正确,您需要转义内部'#',这样它就不会立即得到计算。请看我更新的答案。这太令人恼火了,现在它有一个错误“警告:一个块参数有多个值(0代表1)”。也谢谢你几次来帮助我。
define_method(m) do |&block|
  "<#{block.call if block}>" 
end
self.class.module_eval %Q{
  def #{m}(&block)
    "<\#{block.call if block}>"
  end
}
class MyClass
  def initialize(dynamic_methods)
    @arr = Array.new(dynamic_methods)
    @arr.each { |m|
      self.class.module_eval %Q{
        def #{m}(&block)
          yield(self) if block_given?
        end
      end
    }
    end
end

tmp = MyClass.new ['method1', 'method2', 'method3']
tmp.method1 do |t|
  "here"
end