刚刚发现。
比如之前没有定义变量 obj,然后
if xxxx
obj = .....
.....
end
if obj.nil? # or "if obj"
............
end
这样正常运行。ruby 版本是 1.9.3,是应该这样么?
我也遇到过这种情况,貌似是因为对象还没有被回收,又或者说即使遇到了 if,context 也并没有变化,这是我的猜测...
但是这种写法可不能保证每次运行都正常。
#7 楼 @hz_qiuyuanxin 可以保证每次都正确,因为变量的定义检查在词法解析阶段,也就是说只要在之前有提到,无论是否执行,Ruby 解释器均认为已经定义此变量。
@realwol block 在 ruby 里面是闭包,就像你说的,在里面定义一个变量,外部是不能访问的。 不过 block 会绑定上下文,当碰到闭包的时候作用域不会重新绑定
var_out_of_block = 1
a_block = Proc.new do
puts var_var_out_of_block
end
a_block.call
但是碰到,class, module, def 这三个关键字,变量的作用域会发生重新绑定
var_out_of_class = 1
class AClass
puts var_out_of_class
end
#undefined local variable or method `var_out_of_class' for Aclass:Class
有本书叫 programming ruby 中文,看 第 7 章 第 7 节
还有本书叫 programming ruby 1.9 & 2.0 看 第 9 章 第 7 节
书都不看的吗?那 ruby 的 C 语言源码就更没有人看了吧!(这是为什么呢?)