J'utilise ce code pour permettre à l'utilisateur d'entrer des noms pendant que le programme les stocke dans un tableau jusqu'à ce qu'ils entrent une chaîne vide (ils doivent appuyer 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 serait 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 d'informations à une chaîne aléatoire.
Malheureusement, ce type de boucle ne semble pas exister dans Ruby. Quelqu'un peut-il suggérer une meilleure façon de procéder?
loop do; ...; break if ...; end
?Réponses:
ATTENTION :
Le
begin <code> end while <condition>
est rejeté par l'auteur de Ruby, Matz. Au lieu de cela, il suggère d'utiliserKernel#loop
, par exempleVoici un échange d'e-mails le 23 novembre 2005 où Matz déclare:
Le wiki de RosettaCode a une histoire similaire:
la source
begin end while
méthode ne semblait pas correcte. Merci de m'avoir donné le fourrage dont j'avais besoin pour convaincre le reste de l'équipe.Écrit à l'origine par Jeremy Voorhis . Le contenu a été copié ici car il semble avoir été retiré du site d'origine. Des copies peuvent également être trouvées dans les archives Web et sur Ruby Buzz Forum . -Bill le lézard
la source
begin .. end
est quelque peu mal vu. Utilisezloop do .. break if <condition>
plutôt.Comme ça:
Référence: Ruby's Hidden do {} while () Loop
la source
until info.empty?
plutôt quewhile not info.empty?
.Que dis-tu de ça?
la source
Voici l'article en texte intégral du lien mort de hubbardr vers mon blog.
J'ai trouvé l'extrait suivant lors de la lecture de la source
Tempfile#initialize
dans la bibliothèque principale Ruby:À première vue, j'ai supposé que le
while
modificateur serait évalué avant le contenu debegin...end
, mais ce n'est pas le cas. Observer:Comme vous vous en doutez, la boucle continuera de s'exécuter tant que le modificateur est vrai.
Bien que je serais heureux de ne plus jamais revoir cet idiome, il
begin...end
est assez puissant. Voici un idiome commun pour mémoriser une méthode à une ligne sans paramètres:Voici un moyen laid mais rapide de mémoriser quelque chose de plus complexe:
la source
Cela fonctionne correctement maintenant:
Mais, il peut être supprimé à l'avenir, car la
begin
déclaration est contre-intuitive. Voir: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745Matz (Ruby's Creator) a recommandé de le faire de cette façon:
la source
D'après ce que je comprends, Matz n'aime pas la construction
parce que sa sémantique est différente de
en ce que la première construction exécute le code en premier avant de vérifier la condition, et la deuxième construction teste la condition en premier avant d'exécuter le code (si jamais). Je suppose que Matz préfère conserver la deuxième construction, car elle correspond à une construction de ligne des instructions if.
Je n'ai jamais aimé la deuxième construction, même pour les instructions if. Dans tous les autres cas, l'ordinateur exécute le code de gauche à droite (par exemple || et &&) de haut en bas. Les humains lisent le code de gauche à droite de haut en bas.
Je suggère plutôt les constructions suivantes:
Je ne sais pas si ces suggestions seront analysées avec le reste de la langue. Mais dans tous les cas, je préfère garder l'exécution de gauche à droite ainsi que la cohérence du langage.
la source
la source
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 à l'intérieur de la boucle, et j'ai découvert quewhile true
c'était au moins 2x plus rapide queloop do
. Je ne peux pas expliquer la différence, mais c'est définitivement là. (Découvert lors des tests d'Advent of Code 2017, jour 15.)En voici un autre:
la source
unless
est juste à l'avant et je ne lis pas à travers un tas de code (qui pourrait être plus que montré ici) seulement pour trouver un «balancement»unless
à la fin. C'est un principe général dans le code que le modificateur et les conditions sont plus faciles à utiliser quand ils sont «à l'avant» comme ça.la source