2015-09-29 3 views

ответ

2

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

10

Это один из единственных моментов в 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)