473 votes

Y a-t-il une boucle « do... tandis que » Ruby ?

J’utilise ce code pour laisser l’utilisateur à entrer dans les noms, tandis que le programme stocke dans un tableau jusqu'à ce qu’ils entrent dans une chaîne vide (il faut appuyer sur entrer après chaque nom) :

Ce code ressemblerait beaucoup plus agréable dans un do... while boucle :

Dans ce code je n’ai pas d’attribuer les info d’une chaîne aléatoire.

Malheureusement ce type de boucle ne semble pas exister en Ruby. Est-ce que quelqu'un peut suggérer une meilleure façon d’y parvenir ?

678voto

Siwei Shen Points 5814

ATTENTION:

l' begin <code> end while <condition> est regretté par Ruby auteur du Matz. Au lieu de cela, il suggère d'utiliser des Kernel#loop, par exemple

loop do 
  # some code here
  break if <condition>
end 

pour plus de détails, veuillez vous référer à: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745 (ou via Wayback), et de ce wiki: http://rosettacode.org/wiki/Loops/Do-while#Ruby

188voto

hubbardr Points 1891

À l'origine écrit par Jeremy Voorhis. Le contenu a été copié ici, car il semble avoir été pris vers le bas à partir du site d'origine. Des Copies peuvent également être trouvés dans les Archives Web et à Ruby Buzz Forum. -Bill le Lézard

J'ai trouvé le bout de code suivant lors de la lecture de la source pour le fichier temporaire#initialiser 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 le tout modificateur sera évaluée avant le contenu de commencer...fin, 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

103voto

Blorgbeard Points 38991

44voto

AndrewR Points 2244
Que dis-tu de ça ?

12voto

jvoorhis Points 181

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X