我运行以下代码:
> a = [1,2,3].collect
=> #<Enumerator: [1, 2, 3]:collect>
> b = a.next
=> 1
> a.each do |x| puts x end
1
2
3
=> [nil, nil, nil]
我希望 的结果do是2, 3因为我已经阅读了 的第一个元素a。2, 3我如何优雅地达到结果?
编辑:
澄清一下,我不想跳过第一个条目,我只想以不同的方式处理它。所以我想要两个b和循环。
我运行以下代码:
> a = [1,2,3].collect
=> #<Enumerator: [1, 2, 3]:collect>
> b = a.next
=> 1
> a.each do |x| puts x end
1
2
3
=> [nil, nil, nil]
我希望 的结果do是2, 3因为我已经阅读了 的第一个元素a。2, 3我如何优雅地达到结果?
编辑:
澄清一下,我不想跳过第一个条目,我只想以不同的方式处理它。所以我想要两个b和循环。
这个怎么样?
[1,2,3].drop(1).each {|x| puts x }
# >> 2
# >> 3
这是继续遍历迭代器的方法
a = [1,2,3]
b = a.each # => #<Enumerator: [1, 2, 3]:each>
b.next # skip first one
loop do
c = b.next
puts c
end
# >> 2
# >> 3
你可以做
a.drop(1).each do |x| puts x end
编辑:
使用map方法
b = [1,2,3].drop(1).map{|x| x}
=> b will be [2, 3]
尝试这个:
a.shift
a.each do |x| puts x end
作为旁注,如果您尝试映射除数组的第一个元素之外的所有元素,则 array.drop(1).map {} 显然不起作用。相反,您可以执行以下操作:
[1,2,3].instance_eval { |a| [a.first] + a.drop(1).map { |e| e + 1 } }
试试下面的代码
a=[1,2,3]
a.drop(1)