有没有办法在Ruby中创建一个新的空Binding?

时间:2018-05-10 00:23:54

标签: ruby

有没有办法创建一个完全空Binding个对象以供eval使用?

根据文档,只有Kernel#binding方法可以创建新的绑定。我试过这样的事情:

empty = binding

但是,那个绑定在其局部变量中有empty本身,以及后面在代码中分配的同一范围内的任何其他局部变量。

我发现常量TOPLEVEL_BINDING是一个空的绑定,这足以满足我的直接目的。但它可能并不总是如此。

有没有办法创建一个全新的,完全空的Binding

1 个答案:

答案 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内部的监狱,如果这是你所追求的。