什么相当于$ SAFE = 4?

时间:2014-06-19 17:19:14

标签: ruby eval

当遇到问题时,我正在玩线程和评估。我的代码是:

thread = Thread.start {
  $SAFE = 4;
  eval("`touch ~/test`")
}
thread.join

但它会导致错误:

ArgumentError: $SAFE=4 is obsolete
    from (irb):2:in `block in irb_binding'

我发现$SAFE=4中的$SAFE=4已经过时了:

  

$ SAFE = 4已过时。如果$ SAFE设置为4或更大,则引发ArgumentError。

但是没有提到应该使用什么。是否等同于eval?基本上我想要的是以最安全的方式运行{{1}}。

1 个答案:

答案 0 :(得分:2)

我能看到的唯一方法是利用Binding来安全逃避

http://rdoc.info/stdlib/core/2.1.0/Binding

class Demo
  def initialize(n)
    @secret = n
  end
  def get_binding
    return binding()
  end
end

k1 = Demo.new(99)
b1 = k1.get_binding
k2 = Demo.new(-3)
b2 = k2.get_binding

eval("@secret", b1)   #=> 99
eval("@secret", b2)   #=> -3
eval("@secret")       #=> nil