Voici le texte intégral de l'article de hubbardr morts lien vers mon blog.
J'ai trouvé le bout de code suivant lors de la lecture de la source d' Tempfile#initialize
dans la librairie principale:
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)
Au premier coup d'œil, j'ai pris l' while
modificateur sera évaluée avant le contenu de begin...end
, mais ce n'est pas le cas. Observer:
>> begin
?> puts "do {} while ()"
>> end while false
do {} while ()
=> nil
Comme vous vous en doutiez, la boucle continuera à exécuter, tandis que le modificateur est vrai.
>> n = 3
=> 3
>> begin
?> puts n
>> n -= 1
>> end while n > 0
3
2
1
=> nil
Tandis que je serais heureux de ne jamais voir cet idiome nouveau, begin...end
est assez puissant. Ce qui suit est une commune de l'idiome à memoize un one-liner méthode sans paramètres:
def expensive
@expensive ||= 2 + 2
end
Voici un laid, mais moyen rapide de memoize quelque chose de plus complexe:
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