有没有办法在Ruby中创建一个新的空绑定?
有没有办法创建一个完全空的有没有办法在Ruby中创建一个新的空绑定?,ruby,Ruby,有没有办法创建一个完全空的绑定对象,用于eval 根据文档,只有内核#binding方法才能创建新的绑定。我试过这样的方法: empty = binding 但是,该绑定在其局部变量中有empty本身,以及在代码后面指定的相同范围内的任何其他局部变量 我发现常量TOPLEVEL\u BINDING是一个空的绑定,可以满足我当前的需要。不过,可能并不总是这样 有没有办法创建一个全新的、完全空的绑定?一个简单的方法是编写一个调用绑定而不调用其他任何东西的方法: def empty_binding
绑定
对象,用于eval
根据文档,只有内核#binding
方法才能创建新的绑定。我试过这样的方法:
empty = binding
但是,该绑定在其局部变量中有empty
本身,以及在代码后面指定的相同范围内的任何其他局部变量
我发现常量TOPLEVEL\u BINDING
是一个空的绑定,可以满足我当前的需要。不过,可能并不总是这样
有没有办法创建一个全新的、完全空的
绑定
?一个简单的方法是编写一个调用绑定
而不调用其他任何东西的方法:
def empty_binding
binding
end
然后:
该绑定仍将有一个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
可能比模块更接近空)
这些东西都不会给你带来牢狱之灾,让你安全地eval
进入监狱,如果你想进去的话
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