2013-06-05 68 views
7

我运行下面的代码第一个元素:如何遍历所有但可枚举

> 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和循环。

回答

26

这个怎么样?

[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 
+0

+1击败了我29秒:) –

+0

@Anand:我也有输出示例:) –

+0

确实,我需要向你学习:) –

2

试试这个:

a.shift  
a.each do |x| puts x end 
+0

我编辑了答案。现在检查。 – Deepika

+1

这改变了原来的阵列 –

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] 
+0

这是有效的,还有什么更优雅的不需要我复制删除第一个元素的东西? – Stefan

+0

@Stefan是的,我根据你给出了一个答案。检查它是否符合你的需要。 –

0

试试下面的代码

a=[1,2,3] 
a.drop(1) 
1

一点题外话,如果你试图映射在所有,但一个数组的第一个元素,array.drop(1).MAP {}显然不会工作。相反,你可以这样做:

[1,2,3].instance_eval { |a| [a.first] + a.drop(1).map { |e| e + 1 } } 
+0

上帝,我非常爱你 –

+0

Ruby开发人员比.NET开发人员更热情 –