怎么回事?两种形式的“除非”有什么微妙的区别?
> irb(main):001:0> foo = true unless defined?(foo)
=> nil
irb(main):002:0> unless defined?(fooo) ; fooo = false ; end
=> false
谢谢
最佳答案
显然,ruby在解析时创建了本地变量,将它们设置为nil
,这样就定义了它,无论代码是否执行都可以完成。
当在第一行计算代码时,它不会执行赋值部分,因为foo
设置为nil
。在第二行中,由于尚未解析fooo
,因此defined?
返回nil
,让块内的代码执行并分配fooo
。
例如,您可以尝试:
if false
foo = 43
end
defined? foo
=> "local-variable"
这是从ruby论坛的一个论坛post中获取的。