я ожидал следующий фрагмент кода:`определены и` unless` не работает, как ожидалось
var = "Not Empty" unless defined? var
var # => nil
вернуться "Not Empty"
, но я получил nil
. Любое понимание того, почему это происходит?
я ожидал следующий фрагмент кода:`определены и` unless` не работает, как ожидалось
var = "Not Empty" unless defined? var
var # => nil
вернуться "Not Empty"
, но я получил nil
. Любое понимание того, почему это происходит?
Локальные переменные определяются (как nil
) в точке, где они разбираются. Условие var2
предшествует условию. Это делает значение var2
, даже если задание не выполняется. Затем условие оценивает, что определено значение var2
, которое сохраняет значение nil
для var2
.
Это один из единственных моментов в 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)