3

使用 ruby​​ 调试器block_given 进行测试?给出错误但仍然执行,有人可以解释一下它是如何执行的吗?它与上下文相关(调试器是否更改上下文)?如果是,那么如何找到当前上下文。

现在使用pry 然后block_given而不是ruby ​​-debug?返回true

def test
  debugger
  if block_given?
    yield(4)
  else
    puts "ss"
  end
end
test {|el| puts "#{el}" }
4

1 回答 1

3

这看起来像是 ruby​​-debug 中的一个错误,特别是Kernel#binding_n,这是调试器正在使用的。

您无需进入调试器读取/评估/打印循环即可查看错误。这是一个非交互式示例示例,将debugger()调用替换为binding_n(0)

require 'rubygems'; require 'ruby-debug'
Debugger.start
def test
  puts eval("block_given?", binding_n(0))
  if block_given?
    yield(4)
  else
    puts "ss"
 end
end
test {|el| puts "#{el}" }

Pry 没有这个问题可能是因为它使用 Ruby 的binding()而不是binding_n()。当然这是最靠谱的。

在上面的例子中,这显然是一个胜利,因为binding()正是我们想要的。但与 Pry 一样棒的是,除了当前(或最近的)堆栈帧之外,它无法评估任何堆栈帧上下文中的表达式。

另请参阅http://banisterfiend.wordpress.com/2011/01/27/turning-irb-on-its-head-with-pry/#comment-274,了解 Pry 和 ruby​​-debug 等调试器之间的区别。

最后,我会注意到我在修补过的 MRI 1.9.2 钻孔调试器Rubinius 1.2-ish 的 rbx-trepanning 中都尝试了这个。

它们都按预期工作。在这两种情况下,在 Ruby 运行时的更多帮助下, binding_n的等价物以不同的方式完成。剩下的rb8 -trepanning存在错误,因为它也使用binding_n

于 2011-12-14T06:01:31.607 回答