ruby - 懒洋洋地遍历一个数组

时间:2012-06-02 19:12:09

标签: ruby foreach iteration

我想迭代一个数组的一部分。例如,我尝试打印除第一个元素之外的所有元素:

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

但是array[1..-1]会构建一个新的Array。如果array非常庞大,那就太浪费了。另一种直截了当的方法:

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

有效。但我想知道是否有一些更优雅的技巧。

2 个答案:

答案 0 :(得分:5)

Ruby 2.0将发布Lazy enumerables(好消息!),现在我们可以使用像enumerable-lazy这样的宝石预热引擎:

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

这还不错,但从概念上讲它并不完全适用于你的情况,因为你已经有了一个数组,而不是一个懒惰的对象(一个链表)你必须遍历丢弃元素(好吧,我们只是丢弃一个这里的元素,它不会是一个交易破坏者)。因此,如果您计划大量使用它,您可以将您的解决方案(使用范围的解决方案)抽象为Enumerable#each_from(start_index)

更多:您还可以创建 enumerable-lazy Array#lazy_slice(range)的扩展程序,该扩展程序将返回Enumerable#lazy个对象。它看起来也很不错:xs.lazy_slice(1..-1).each { |x| puts x }

答案 1 :(得分:1)

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