`定义?`和`除非'没有按预期工作

时间:2015-09-29 08:03:16

标签: ruby local-variables postfix-notation

我期待以下代码段:

var = "Not Empty" unless defined? var
var # => nil

返回"Not Empty",但我得到nil。对此为何发生的任何见解?

2 个答案:

答案 0 :(得分:10)

这是Ruby中我称之为实际WTF的唯一时刻之一。

你必须使用

unless defined? var
  var = :value
end

使用postfix语法,解释器将在内部nil - ify值,以便它可以推断变量,从而在检查完成之前定义它:

# Doesn't print anything
unless defined?(foo) and (p(foo) or true)
  foo = :value
end

# Prints nil
bar = :value unless defined?(bar) and (p(bar) or true)

答案 1 :(得分:2)

在解析它们时定义局部变量(如nil)。 var2的定义先于条件。即使未执行赋值,也会定义var2。然后,条件评估定义var2,保留nil的值var2