Вот полный текст статьи из мертвой ссылки Хаббардра на мой блог.
Я нашел следующий фрагмент при чтении источника для Tempfile#initialize
в базовой библиотеке Ruby:
begin
tmpname = File.join(tmpdir, make_tmpname(basename, n))
lock = tmpname + '.lock'
n += 1
end while @@cleanlist.include?(tmpname) or
File.exist?(lock) or File.exist?(tmpname)
На первый взгляд, я предполагал, что модификатор while
будет оценен до содержимого begin...end
, но это не так. Обратите внимание:
>> begin
?> puts "do {} while ()"
>> end while false
do {} while ()
=> nil
Как и следовало ожидать, цикл продолжит выполняться, пока модификатор имеет значение true.
>> n = 3
=> 3
>> begin
?> puts n
>> n -= 1
>> end while n > 0
3
2
1
=> nil
Хотя я был бы рад никогда больше не видеть эту идиому, begin...end
довольно мощный. Ниже приводится распространенная идиома для запоминания однострочного метода без параметров:
def expensive
@expensive ||= 2 + 2
end
Вот ужасный, но быстрый способ запомнить что-то более сложное:
def expensive
@expensive ||=
begin
n = 99
buf = ""
begin
buf << "#{n} bottles of beer on the wall\n"
# ...
n -= 1
end while n > 0
buf << "no more bottles of beer"
end
end