2012-06-02 4 views
3

Je veux parcourir une partie d'un tableau. Par exemple, je tente d'imprimer tous les éléments sauf la première:ruby ​​- parcourir paresseusement un tableau

array[1..-1].each {|e| puts e} 

Mais array[1..-1] construit une nouvelle Array. C'est gaspillage si array est très énorme. Une autre approche directe:

(1...array.size).each { |i| puts array[i] } 

Cela fonctionne. Mais je me demande s'il y a des trucs plus élégants.

Répondre

5

Ruby 2.0 expédiera Lazy enumerables (nouvelles fantastiques!), Pour l'instant nous pouvons réchauffer les moteurs utilisant des pierres précieuses comme enumerable-lazy:

require 'enumerable/lazy' 
xs.lazy.drop(1).each { |x| puts x } 

C'est pas mal, mais sur le plan conceptuel, il ne s'applique pas exactement à votre cas, puisque vous avez déjà un tableau, pas un objet paresseux (une liste chaînée) que vous devez traverser pour jeter les éléments (ok, nous ne faisons que jeter un élément ici, ce ne serait pas un deal-breaker). Donc, vous pouvez simplement résumer votre solution (celle-ci en utilisant une plage) comme Enumerable#each_from(start_index) si vous prévoyez de l'utiliser beaucoup.

En savoir plus: vous pouvez également créer une extension dénombrable-paresseuxArray#lazy_slice(range), qui retourne un objet Enumerable#lazy. Il semble également très bon: xs.lazy_slice(1..-1).each { |x| puts x }

1
array.each_with_index {|x, i| puts x unless i.eql?0} 
+2

'puts x à moins i.zero?' Heh :) – fl00r

+0

@ fl00r ouais :) il y a de nombreux moyens de comparer. – kiddorails

Questions connexes