Оператор puts выполняется до того, как изначально определена переменная 'b', что приводит к ошибке.
Как аналогичный пример, но с до-заявления, не рассмотрим следующий код:
a = [1, 2]
begin
puts "in the block"
end until b = a.pop
можно ожидать б быть определена в блоке?
Технически единственным отличием является то, что до тех пор, пока не будет установлено истинное значение возврата, пока оно будет продолжаться до тех пор, пока a.pop вернет истинное значение.
Дело в обоих случаях является то, что б не является в рамках до присвоения произошло. Сразу после назначения, например, когда цикл возвращается, b появляется в текущей области. Это называется лексическим охватом, и как работает рубин для локальных переменных, подобных этому.
Я нашел this article, чтобы быть полезной для понимания области действия в рубине.
Update 1: В предыдущей версии моего ответа я написал, что это не сравнимо с если. Хотя это все еще так, это не имеет никакого отношения к вопросу, который является простой проблемой с областью.
Обновление 2: Добавлена ссылка на более подробные пояснения относительно области видимости в рубине.
Обновление 3: Убрано первое предложение, поскольку это было неправильно.
хотя бы попробовать рубин, который менее древний :) –
@SergioTulentsev, справедливая точка. Я использую последнее в репозиториях Ubuntu 14.04 LTS :) –
Когда вы читаете свой пример # 2 по строкам слева направо, '' '' 'определяется в конце инструкции' puts'? Я не удивлен, не так ли? Еще один более короткий пример, который не подходит по той же причине: 'p a if a' – spickermann