繁体   English   中英

Ruby class_eval和yield

[英]Ruby class_eval and yield

伙计,我今天要去皮洋葱层,反正这是代码

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)中的“ here”。 当前的语句“ <#{如果block_given会屈服于自己?}>”不会给我那句话。 如果您想知道,我必须保留这部分代码,但是我可以对MyClass进行所有更改。

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

任何人都可以帮助语法吗? 在此先感谢您的帮助。

更新:请参阅下面的我的答案。

尝试更换

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

与:

define_method(m) do |&block|
  "<#{block.call if block}>" 
end

这应该适用于1.8.7及更高版本。 您也可以尝试使用module_eval

self.class.module_eval %Q{
  def #{m}(&block)
    "<\#{block.call if block}>"
  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的所有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM