我期待以下代码段:

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

返回"Not Empty",但是我得到了nil。为什么会发生这种情况的任何见解?

最佳答案

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

你必须用

unless defined? var
  var = :value
end

使用后缀语法,解释器将在内部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)

10-08 04:26