`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
.