怎么回事?两种形式的“除非”有什么微妙的区别?

> 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中获取的。

10-08 04:31