web-dev-qa-db-fra.com

échapper à l'itération .each {} au début de Ruby

code:

 c = 0  
 items.each { |i|  
   puts i.to_s    
   # if c > 9 escape the each iteration early - and do not repeat  
   c++  
 }  

Je veux saisir les 10 premiers éléments, puis quitter la boucle "chaque".

Que dois-je remplacer la ligne commentée? Est-ce qu'il y a une meilleure approche? quelque chose de plus Ruby idiomatique?

39
BuddyJoe

Bien que la solution break fonctionne, je pense qu'une approche plus fonctionnelle convient vraiment à ce problème. Vous voulez take les 10 premiers éléments et les imprimer alors essayez

items.take(10).each { |i| puts i.to_s }
59
nimrodm

Il n'y a pas ++ opérateur dans Ruby. C'est aussi la convention d'utiliser do et end pour les blocs multilignes. Modifier votre solution donne:

c = 0  
items.each do |i|  
  puts i.to_s    
  break if c > 9
  c += 1 
end

Ou aussi:

items.each_with_index do |i, c|  
  puts i.to_s    
  break if c > 9
end

Voir each_with_index et aussi Programmation Ruby Break, Redo et Next .

Mise à jour: réponse de Chuck avec des plages est plus semblable à Ruby, et réponse de nimrodm en utilisant take est encore mieux.

47
Sarah Vessels

break fonctionne pour s'échapper tôt d'une boucle, mais c'est plus idiomatique juste pour faire items[0..9].each {|i| puts i}. (Et si tout ce que vous faites est d'imprimer littéralement les éléments sans aucune modification, vous pouvez simplement faire puts items[0..9].)

7
Chuck

Une autre variante:

puts items.first(10)

Notez que cela fonctionne très bien avec des tableaux de moins de 10 éléments:

>> nums = (1..5).to_a
=> [1, 2, 3, 4, 5]
>> puts nums.first(10)
1
2
3
4
5

(Une autre remarque, beaucoup de gens proposent une certaine forme de puts i.to_s, mais dans ce cas, n'est-ce pas .to_s redondant? puts appellera automatiquement .to_s sur une non-chaîne pour l'imprimer, pensai-je. Vous auriez seulement besoin de .to_s si vous vouliez dire puts 'A' + i.to_s ou similaire.)

4
Telemachus

Une autre option serait

items.first(10).each do |i|
  puts i.to_s
end

Cela me semble un peu plus facile que de se briser sur un itérateur, et ne retournera d'abord que le nombre d'éléments disponibles s'il n'y en a pas assez.

4
Emily

Cela ressemble-t-il à ce que vous voulez?

10.times { |i|
  puts items[i].to_s
}
1
Chris Lutz
items.each_with_index { |i, c| puts i and break if c <= 9 }
0
khelll