红宝石 - 懒惰地遍历数组(ruby - lazily iterate through an arr

2019-09-17 17:47发布

我想通过一个阵列的一部分进行迭代。 例如,我尝试打印的每一个元素,除了第一种:

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

array[1..-1]建立一个新的Array 。 这是浪费,如果array是非常巨大的。 另一种简单的方法:

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

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

Answer 1:

红宝石2.0将推出懒惰可枚举 (好消息!),现在我们可以热身使用像宝石引擎枚举懒 :

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

这不是坏事,但在概念上它并不完全适用于你的情况,因为你已经有一个数组,而不是一个懒惰的对象(链表),您必须遍历丢弃元素(好吧,我们只是丢弃一个元素在这里,它不会是一个致命弱点)。 所以,你可以只是抽象的解决方案(即一个使用范围)作为Enumerable#each_from(start_index)如果你打算使用它了。

更多信息:你也可以创建一个扩展枚举懒 Array#lazy_slice(range) ,这将返回一个Enumerable#lazy对象。 它看起来也不错: xs.lazy_slice(1..-1).each { |x| puts x } xs.lazy_slice(1..-1).each { |x| puts x }



Answer 2:

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


文章来源: ruby - lazily iterate through an array