Я прочитал несколько вещей, включая это и это , но я думаю, что приведенный ниже пример отличается от того, о чем они говорят.Один человек на самом деле приводит аналогичный пример в дискуссии, но он игнорируется.
Итак, запустите в irb (игнорируйте предупреждения о назначении в условном выражении):
(puts x) if (x = 0) # NameError: undefined local variable or method `x'...
x # => 0
(puts x) if (x = 0) # "0", => nil
, но во второй раз ошибки нет.
Имеет ли это какой-то смысл, даже в том смысле, что «когда вы понимаете, что на самом деле делает парсер и что это всего лишь некоторая оптимизация, все становится понятным»?Потому что для меня это кажется довольно нежелательным.
Для ясности, приведенное выше условное выражение должно быть эквивалентно (верно?)
if newvar=0
puts newvar
end
, что не вызывает ошибку.
Обновление: естьбыло еще больше сообщений на эту тему, так как этот вопрос был задан.Например,
http://seejohncode.com/2012/07/31/ruby-gotcha-single-line-conditionals/.