Ruby 迭代数组的每个元素,第一个元素除外
编写此代码的惯用Ruby方法是什么 给定一个数组,我希望遍历该数组的每个元素,但跳过第一个元素。我希望在不分配新数组的情况下执行此操作 我想出了两种方法,但都不觉得特别优雅 这是可行的,但似乎过于冗长:Ruby 迭代数组的每个元素,第一个元素除外,ruby,arrays,enumeration,idioms,Ruby,Arrays,Enumeration,Idioms,编写此代码的惯用Ruby方法是什么 给定一个数组,我希望遍历该数组的每个元素,但跳过第一个元素。我希望在不分配新数组的情况下执行此操作 我想出了两种方法,但都不觉得特别优雅 这是可行的,但似乎过于冗长: arr.each_with_index do |elem, i| next if i.zero? # skip the first ... end 这可以工作,但会分配一个新阵列: arr[1..-1].each { ... } 编辑/澄清:我希望避免分配第二个数组。最初我说我想避免
arr.each_with_index do |elem, i|
next if i.zero? # skip the first
...
end
这可以工作,但会分配一个新阵列:
arr[1..-1].each { ... }
编辑/澄清:我希望避免分配第二个数组。最初我说我想避免“复制”数组,这会让人困惑
我希望在不创建阵列副本的情况下执行此操作
1) 内部迭代器:
arr = [1, 2, 3]
start_index = 1
(start_index...arr.size).each do |i|
puts arr[i]
end
--output:--
2
3
arr = [1, 2, 3]
e = arr.each
e.next
loop do
puts e.next
end
--output:--
2
3
2) 外部迭代器:
arr = [1, 2, 3]
start_index = 1
(start_index...arr.size).each do |i|
puts arr[i]
end
--output:--
2
3
arr = [1, 2, 3]
e = arr.each
e.next
loop do
puts e.next
end
--output:--
2
3
好吧,也许这不是回答我自己问题的好方式。但我一直在绞尽脑汁研究这些文件,我认为我找到了一个很好的解决方案:
arr.lazy.drop(1).each { ... }
以下是它有效的证据:-)
简明:是的。地道的红宝石……也许?您认为呢?使用内部枚举器肯定更直观,您可以非常优雅地这样做:
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
您的第二个元素不会复制数组。@sawa它本身不会复制数组,但它会根据
array[]
上的文档创建一个包含除第一个元素以外的所有元素的新数组;我是否误解了要求?我同意你的评估。另外两个选项是只使用索引:(1…arr.size);arr.each{e | if first;first=false;next;end;…}
。我对问题进行了编辑,以澄清我希望避免分配新数组。这就是我写“不复制”的意思。“复制”并不是一个令人困惑的术语。事实上,这是一个艺术术语。谢谢!从概念上讲,这正是我的想法。即:枚举数组,丢弃第一个元素,然后处理其余元素。但代码相当冗长。我想这是不可避免的?关于#2,应该注意的是,通过消除块,您扩大了OP块中以前的块的范围。drop
仍将创建一个新数组,lazy
只会延迟此活动,直到调用每个。很好的尝试。谢谢@PinnyM。抢手货我同意目前为止最好的解决办法。或者,each_after
方法可以在Enumerable
而不是Array
上定义,并且具有相同的效果,对吗?似乎它对非数组枚举也很有用。非常好!对于MATBRICTSON的建议,如果没有给出块,则考虑返回枚举器以允许链接。