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.