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

Nom*_*man 10 ruby local-variables postfix-notation

我期待以下片段:

var = "Not Empty" unless defined? var
var # => nil
Run Code Online (Sandbox Code Playgroud)

回来"Not Empty",但我得到了nil.任何洞察为什么会发生这种情况?

ndn*_*kov 10

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

你必须使用

unless defined? var
  var = :value
end
Run Code Online (Sandbox Code Playgroud)

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

# 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)
Run Code Online (Sandbox Code Playgroud)


saw*_*awa 2

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