2013-06-05 77 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開發人員更熱情 –