Est-il un “do ... while” boucle en Ruby?
Je suis en utilisant ce code pour permettre à l'utilisateur d'entrer les noms de tout le programme stocke dans un tableau, jusqu'à ce qu'ils entrent dans une chaîne vide (ils doivent appuyez sur entrée après chaque nom):
people = []
info = 'a' # must fill variable with something, otherwise loop won't execute
while not info.empty?
info = gets.chomp
people += [Person.new(info)] if not info.empty?
end
Ce code aurait l'air beaucoup plus agréable dans une boucle do ... while:
people = []
do
info = gets.chomp
people += [Person.new(info)] if not info.empty?
while not info.empty?
Dans ce code je n'ai pas à attribuer info certaine chaîne de caractères aléatoires.
Malheureusement, ce type de boucle ne semble pas exister en Ruby. Quelqu'un peut-il suggérer une meilleure façon de faire cela?
- Je pense que la normale tandis que la boucle sera plus joli et plus facile à lire.
- Ruten est-il possible que vous seriez intéressés par un changement de la accepté de répondre à Siwei Shen réponse,
loop do; ...; break if ...; end
?
Vous devez vous connecter pour publier un commentaire.
ATTENTION:
La
begin <code> end while <condition>
est rejeté par Ruby auteur du Matz. Au lieu de cela, il suggère d'utiliserKernel#loop
, par exempleVoici un échange de mail dans 23 Nov 2005 où Matz états:
RosettaCode wiki a une histoire similaire:
begin end while
méthode ne semblent pas droit. Merci de me donner le fourrage, j'ai besoin de convaincre le reste de l'équipe.Écrit à l'origine 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 le Archive Web et à Ruby Buzz Forum. -Bill le Lézard
begin .. end
est un peu mal vu. Utilisationloop do .. break if <condition>
à la place.Comme ceci:
Référence: Le rubis est Caché do {} while () en Boucle
until info.empty?
plutôt quewhile not info.empty?
.Comment à ce sujet?
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 pour
Tempfile#initialize
dans la librairie principale:Au premier coup d'œil, j'ai pris le
while
modificateur sera évaluée avant le contenu debegin...end
, mais ce n'est pas le cas. Observer:Que vous attendez, la boucle continuera à exécuter, tandis que le modificateur est vrai.
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:Ici est moche, mais moyen rapide de memoize quelque chose de plus complexe:
Cela fonctionne correctement maintenant:
Mais, il est peut-être supprimer à l'avenir, parce que le
begin
déclaration est contraire à l'intuition. Voir: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745Matz (Ruby Créateur) a recommandé de le faire de cette façon:
De ce que je comprends, Il n'aime pas la construction
parce que c'est de la sémantique est différente de celle
en ce que la première construction exécute le code en premier avant de la vérification de l'état,
et la deuxième construire des tests de la condition d'abord avant d'exécuter le code (si jamais). Je le prends Matz préfère garder la deuxième construire car il correspond à une ligne de construction de if.
Je n'ai jamais aimé le deuxième construire, même pour des instructions if. Dans tous les autres cas, l'ordinateur
exécute le code de gauche à droite (eg. || et &&) de haut en bas. L'homme lire le code de gauche à droite
de haut en bas.
Je suggère que les constructions suivantes à la place:
Je ne sais pas si ces suggestions seront analysés avec le reste de la langue. Mais dans tous les cas
Je visez plutôt garder la gauche à la droite de l'exécution ainsi que la langue de la cohérence.
while true
peut être remplacé parloop do
.while true
peut être remplacé parloop do
. Mais j'ai testé les deux constructions avec beaucoup d'itérations dans la boucle, et a découvert quewhile true
est au moins 2x rapide queloop do
. Ne peut pas expliquer la différence, mais c'est bel et bien là. (Découvert lors des tests de l'Avent du Code de 2017, jour 15.)En voici une autre:
unless
est juste à l'avant et je n'ai pas lu à travers un tas de code (qui pourrait être plus que ce qui est illustré ici) seulement pour trouver une 'pendant'unless
à la fin. C'est un principe général du code modificateur et les conditions sont plus faciles à utiliser quand ils sont "à l'avant" comme ceci.