Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 迭代数组的每个元素,第一个元素除外_Ruby_Arrays_Enumeration_Idioms - Fatal编程技术网

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 { ... } 编辑/澄清:我希望避免分配第二个数组。最初我说我想避免

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

给定一个数组,我希望遍历该数组的每个元素,但跳过第一个元素。我希望在不分配新数组的情况下执行此操作

我想出了两种方法,但都不觉得特别优雅

这是可行的,但似乎过于冗长:

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的建议,如果没有给出块,则考虑返回枚举器以允许链接。