有没有办法创建一个完全空Binding
个对象以供eval
使用?
根据文档,只有Kernel#binding
方法可以创建新的绑定。我试过这样的事情:
empty = binding
但是,那个绑定在其局部变量中有empty
本身,以及后面在代码中分配的同一范围内的任何其他局部变量。
我发现常量TOPLEVEL_BINDING
是一个空的绑定,这足以满足我的直接目的。但它可能并不总是如此。
有没有办法创建一个全新的,完全空的Binding
?
答案 0 :(得分:3)
一种简单的方法是编写一个调用binding
的方法,而不是其他方法:
def empty_binding
binding
end
然后:
b = empty_binding
b.local_variables
# [ ]
该绑定仍然具有self
,并且可以访问self
可用的任何实例变量。你可以用一些诡计来限制它:
module Empty
def self.binding
super
end
end
b = Empty.binding
b.eval('puts local_variables.inspect')
# [ ]
b.eval('puts instance_variables.inspect')
# [ ]
b.eval('puts self.inspect')
# Empty
什么有效取决于目标是什么。没有局部变量的绑定非常简单,在没有黑客攻击Ruby本身的情况下完全没有任何绑定可能是不可能的(尽管BasicObject
可能对于比模块更接近空来有用。)< / p>
这些事情都没有给你一个安全eval
内部的监狱,如果这是你所追求的。