我想为我的简单Ruby函数添加一些调试,我编写了如下的函数:
def debug(&block)
varname = block.call.to_s
puts "#{varname} = #{eval(varname,block)}"
end
debug {:x} #prints x = 5
debug {:y} #prints y = 5
我知道eval是有害的。所以我有两个问题。
- 有没有不使用eval的方法来编写debug方法?如果没有,有没有首选方法来实现这一点?
- 有没有办法将参数列表传递给此方法?我理想情况下希望使用debug {:x, :y.:任意数量的变量}。但我无法弄清如何在debug方法中实现这一点(即接受参数列表)
Array()
会出错,这就是为什么我避免使用它的原因,但在这种情况下,语言规范保证rest参数将始终是一个数组。 - Jörg W Mittagbinding
在def debug(*vars, bnd)
示例中的作用吗? - mačekBinding
明确地作为参数传递到方法中。在其他示例中,我们使用一个Proc
对象(或更准确地说,我们使用一个块,并用&
符号将其转换为Proc
)。在Ruby中,块是闭包(即它们“记住”在定义它们的地方存在的变量,而不是它们执行的地方),这意味着它们携带着一个Binding
。因此,我们可以从块中提取Binding
而不是将其传递。 - Jörg W Mittag