最近在读<>,对 p152 中的一个例子有些疑惑,大致代码如下
puts $SAFE
class ERB
attr_accessor :safe_level
def result(b = TOPLEVEL_BINDING)
puts $SAFE
if(@safe_level)
proc {
$SAFE = @safe_level
puts $SAFE
#eval(@src , b, (@filename || '(erb)'),1)
}.call
else
#eval(@src ,b ,(@filename || '(erb)'), 1)
end
end
end
erb = ERB.new
erb.safe_level = 3
erb.result
puts $SAFE
运行结果如下:
0
0
3
0
$SAFE 是个全局变量,照理说在 proc 中修改了值,应该是在所有作用域中都生效的啊,为什么在执行完 proc 后,$SAFE 的值又会变回执行 proc 之前的值?
为此我又写了另外一段类似的代码,但是自定义了一个全局变量$SAFE2
$SAFE2 = 0
puts $SAFE2
class ERB
attr_accessor :safe_level
def result(b = TOPLEVEL_BINDING)
puts $SAFE2
if(@safe_level)
proc {
$SAFE2 = @safe_level
puts $SAFE2
#eval(@src , b, (@filename || '(erb)'),1)
}.call
else
#eval(@src ,b ,(@filename || '(erb)'), 1)
end
end
end
erb = ERB.new
erb.safe_level = 3
erb.result
puts $SAFE2
运行结果如下
0
0
3
3
这次我自定义了一个全局变量$SAFE2,在 proc 中修改了值之后,是在之后的作用域内也生效了,难道对$SAFE 这个全局变量,Ruby 有什么特殊处理么?