遍历数组的每个元素,除了第一个
Iterating over each element of an array, except the first one
编写此代码的惯用 Ruby 方式是什么?
给定一个数组,我想遍历该数组的每个元素,但跳过第一个元素。我想在不分配新数组的情况下执行此操作。
这是我想出的两种方法,但感觉都不是特别优雅。
这行得通,但似乎太冗长了:
arr.each_with_index do |elem, i|
next if i.zero? # skip the first
...
end
这有效但分配了一个新数组:
arr[1..-1].each { ... }
Edit/clarification:我想避免分配第二个数组。本来我说我想避免"copying"数组,这很混乱。
I want to do this without creating a copy of the array.
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
好的,也许这是回答我自己的问题的错误形式。但我一直在绞尽脑汁研究 Enumerable 文档,我认为我找到了一个很好的解决方案:
arr.lazy.drop(1).each { ... }
这是它有效的证明:-)
>> [1,2,3].lazy.drop(1).each { |e| puts e }
2
3
简洁:是的。惯用语 Ruby... 也许吧?你怎么看?
使用内部枚举器当然更直观,您可以像这样相当优雅地做到这一点:
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
编写此代码的惯用 Ruby 方式是什么?
给定一个数组,我想遍历该数组的每个元素,但跳过第一个元素。我想在不分配新数组的情况下执行此操作。
这是我想出的两种方法,但感觉都不是特别优雅。
这行得通,但似乎太冗长了:
arr.each_with_index do |elem, i|
next if i.zero? # skip the first
...
end
这有效但分配了一个新数组:
arr[1..-1].each { ... }
Edit/clarification:我想避免分配第二个数组。本来我说我想避免"copying"数组,这很混乱。
I want to do this without creating a copy of the array.
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
好的,也许这是回答我自己的问题的错误形式。但我一直在绞尽脑汁研究 Enumerable 文档,我认为我找到了一个很好的解决方案:
arr.lazy.drop(1).each { ... }
这是它有效的证明:-)
>> [1,2,3].lazy.drop(1).each { |e| puts e }
2
3
简洁:是的。惯用语 Ruby... 也许吧?你怎么看?
使用内部枚举器当然更直观,您可以像这样相当优雅地做到这一点:
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