3 votes

Changement dynamique des boucles "each" en Ruby

Je suis un débutant en Ruby et je suis confronté à un problème concernant les boucles de type "each". Supposons un code comme le suivant

startIndex = 1
endIndex = 200

(startIndex..endIndex).each do |value|
   p value
   if value>150 then endIndex=100
end

Lorsque j'exécute le code, il s'exécute jusqu'à 200, mais pas jusqu'à 150. Existe-t-il un moyen de modifier dynamiquement les limites de la boucle en Ruby ?

Merci d'avance pour votre aide

Tryskele

8voto

F0RR Points 337

Pourquoi ne pas simplement break ?

(startIndex..endIndex).each do |value|
    p value
    break if value>=150
end

Car c'est une très mauvaise pratique que de modifier dynamiquement les limites de la boucle.

3voto

johannes Points 3878
startIndex= 1
endIndex= 200

range= (startIndex .. endIndex) # => 1..200

endIndex= 150
range # => 1..200

(a..b) crée un objet de la classe Range. Un objet Range ne contient pas de pointeurs vers les variables que vous transmettez. Il contient plutôt des références aux objets vers lesquels les variables pointent. Si vous modifiez la variable, de sorte qu'elle contienne une référence à un autre objet, la plage conserve la référence à l'ancien objet. Vous pouvez donc modifier la plage en changeant l'objet lui-même. Mais il n'y a aucun moyen de modifier un Integer une fois qu'il a été créé.

a= "abc"
b= "def"
range= (a..b) # => "abc".."def"
b.sub!("e", "$")
range # => "abc".."d$f"

Si la seule chose que vous voulez faire est de sortir de la boucle, vous pouvez simplement utiliser break

(a..b).each do |v|
  break if something
end

2voto

Jörg W Mittag Points 153275

Non, ce que vous essayez de faire ne fonctionnera pas. Cependant, c'est aussi complètement inutile, puisqu'il existe un beaucoup meilleure façon, idiomatique, de faire exactement la même chose que vous essayez de faire :

p *(1..150)

0voto

hobodave Points 14566

Non.

Ce n'est certainement pas ce que vous voulez faire.

Quel problème essayez-vous de résoudre ?

0voto

kwon Points 15464

Si vous voulez simplement arrêter l'impression à 150, cela peut fonctionner.

startIndex = 1
endIndex = 200

(startIndex..endIndex).each do |value|
   p value if value <= 150
end

ou

startIndex = 1
endIndex = 200

(startIndex..endIndex).each do |value|
   p value
   if value >= 150 
     break
   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