Почему это не встроено, если тест работает? - PullRequest
4 голосов
/ 19 марта 2012

У меня есть встроенная строка, которая не выполняет то, что я думала, и я для ясности перевела ее в пример консоли.

Я думала, что встроенная строка синтаксически совпадает сстрока if, но похоже, что это не так.

foo = "chunky"
(bar1 = foo) if (!defined?(bar1) && foo)
bar1

В этом случае bar1 заканчивается на nil.Если я реструктурирую его на

foo = "chunky"
if !defined?(bar2) && foo
  bar2 = foo
end
bar2

, то это сработает - для bar2 установлено значение "коренастый" (во втором примере я использовал bar2 вместо bar1, чтобы убедиться, что я использовал неопределенную переменную в каждом случае).

Это тот случай, когда inline, если всегда устанавливает что-то в bar1, по умолчанию nil?Я думал, что он просто не оценил часть перед if, если if проверяет ложь.

1 Ответ

7 голосов
/ 19 марта 2012

Сбой, потому что как только в левой части задания видно голое слово, оно инициализируется как nil.Таким образом, когда вы делаете (bar1 = foo) if (!defined?(bar1) && foo), bar1 будет nil в проверке defined?.Вот упрощенный пример:

>> defined? foo
=> nil
>> foo = 1 if false
=> nil
>> foo
=> nil
>> defined? foo
=> "local-variable"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...