ruby元编程 - yield块无法动态添加方法

时间:2009-10-22 02:57:40

标签: ruby metaprogramming instance-eval

我正在努力在rspec中扩展存根方法的NotAMock框架,并将存根转换为方法块。

code in this Gist在我自己编写代码时完美运行(这与NotAMock存根方法类似)。

但是当我将object.instance_eval ...代码合并到NotAMock框架中时,“block_given?”总是返回错误,因此我永远无法让我的收益工作。正确添加了该方法,我可以调用stubbed方法......但它不能识别我从NotAMock存根版本传递给该方法的块。

要了解我如何将此代码合并到NotAMock框架中,请转到my clone of NotAMock并查看私有方法中的“add_hook”方法。

我知道这有点问...我希望找到一些指导。它一直让我疯狂。

2 个答案:

答案 0 :(得分:2)

我甚至不确定这是可能的。 New Procs甚至不识别块。

proc = Proc.new do
  if block_given?
    yield
  else
    puts "Not in a block"
  end
end

proc.call { puts "In a block"} # => puts Not in a block

Ruby 1.9应该允许块作为参数获取和阻止。但我不知道这是否有效,或者即使它允许条件块。

答案 1 :(得分:0)

事实证明这个问题与我链接到的代码无关...... NotAMock框架正在做一些导致我的问题的额外方法重新定义。我已经将问题缩小到一个特定的代码行,并且正在研究如何解决它。