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?
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 }
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.
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]
.)
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.)
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.
Cela ressemble-t-il à ce que vous voulez?
10.times { |i|
puts items[i].to_s
}
items.each_with_index { |i, c| puts i and break if c <= 9 }