迭代数组的每个元素,第一个元素除外

时间:2015-04-03 01:36:45

标签: ruby arrays enumeration idiomatic

编写此代码的惯用Ruby方式是什么?

给定一个数组,我想遍历该数组的每个元素,但跳过第一个。我想在不分配新阵列的情况下这样做。

这是我提出的两种方式,但感觉不是特别优雅。

这有效,但似乎太冗长了:

arr.each_with_index do |elem, i|
  next if i.zero? # skip the first
  ...
end

这样可行,但会分配一个新数组:

arr[1..-1].each { ... }

编辑/澄清:我想避免分配第二个数组。最初我说我想避免“复制”数组,这令人困惑。

3 个答案:

答案 0 :(得分:6)

使用内部枚举器肯定更直观,你可以像这样优雅地做到这一点:

class Array
  def each_after(n)
    each_with_index do |elem, i|
      yield elem if i >= n
    end
  end
end

现在:

arr.each_after(1) do |elem|
  ...
end

答案 1 :(得分:1)

  

我想在不创建数组副本的情况下这样做。

1)内部迭代器:

arr = [1, 2, 3]
start_index = 1

(start_index...arr.size).each do |i|
  puts arr[i]
end

--output:--
2
3

2)外部迭代器:

arr = [1, 2, 3]
e = arr.each
e.next

loop do
  puts e.next
end

--output:--
2
3

答案 2 :(得分:0)

好吧,也许这是回答我自己的问题的不好的形式。但是我一直在努力研究这个问题并仔细阅读Enumerable文档,我认为我找到了一个很好的解决方案:

arr.lazy.drop(1).each { ... }

以下证明它有效: - )

>> [1,2,3].lazy.drop(1).each { |e| puts e }
2
3

简明:是的。惯用的Ruby ......也许吧?你觉得怎么样?