`defined?` и `if` не работает должным образом

Я ожидал следующий фрагмент:

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

чтобы вернуть "Not Empty", но я получил nil. Любое понимание того, почему это происходит?

Ответ 1

Это один из единственных моментов в Ruby, которые я бы назвал фактическими WTF.

Вы должны использовать

unless defined? var
  var = :value
end

С синтаксисом 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)

Ответ 2

Локальные переменные определяются (как nil) в той точке, где они разбираются. Определение var2 предшествует условию. Это определяет var2, даже если если задание не выполняется. Затем условие оценивает, что определено var2, которое сохраняет значение nil для var2.