Руби: «foo = true, если! Определено? Фу »не будет работать, как ожидалось

Когда он на самом деле не определен, он получает значениеnil просто потому что это было "тронуто"

$ irb

ruby-1.9.2-p0 > foo = true if !defined? foo
 => nil 
ruby-1.9.2-p0 > foo
 => nil 

ruby-1.9.2-p0 > if !defined? bar
ruby-1.9.2-p0 ?>  bar = true
ruby-1.9.2-p0 ?>  end
 => true 
ruby-1.9.2-p0 > bar
 => true 

Итакif ...end работает как положено, ноfoo = true if ... не делает.

 Jaco Pretorius23 сент. 2010 г., 10:38
NullUserException: Значит, сначала не выполняется проверка «если»? Интересно.
 NullUserException23 сент. 2010 г., 06:29
Это потому, что foo определяется временем, когда вы звонитеdefined?, Я не вижу, как это неожиданно

Ответы на вопрос(3)

Решение Вопроса

Ruby определяет локальную переменную непосредственно перед выполнением строки, содержащей присваивание, поэтомуdefined?(foo) всегда будетtrue для одного лайнера.

Другой пример, показывающий, что локальные переменные определены перед выполнением любой части строки:

defined? foo # => false
foo = foo    # => foo is now nil

это звучит разумно, что [заявление], если [выражение]

просто перекомпонован компилятором в

если [выражение], то [утверждение] конец

но похоже, что он обрабатывается специально таким образом, который нарушает определенные? на самом деле, определенный выглядит как специальная конструкция (то есть не нормальная функция)

Похоже, если вы назначаете его в той же строке, вы должны проверить .nil? вместо:

foo = foo.nil? ? правда: foo

(это также работает, если оно уже установлено в false)

Способ думать об этом:

foo = (true if !defined? foo)

Итак, сначала определяется foo, затем запускается выражение для присвоения ему значения.

 太極者無極而生25 сент. 2010 г., 07:46
это «думать об этом так», а не так, как это происходит на самом деле?

Ваш ответ на вопрос