Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在Ruby中创建一个新的空绑定?_Ruby - Fatal编程技术网

有没有办法在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