当遇到问题时,我正在玩线程和评估。我的代码是:
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}}。
答案 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