2013-02-02 14 views
0
a=[11,22,31,224,44].to_enum 
=> #<Enumerator: [11, 22, 31, 224, 44]:each> 
a.select.with_index{|x| puts x if x<2 } 
=> [] 
a.with_index(2) 
=> #<Enumerator: #<Enumerator: [11, 22, 31, 224, 44]:each>:with_index(2)> 
irb(main):011:0> a.with_index(2){|x| puts x if x==224} 
224 
=> [11, 22, 31, 224, 44] 
a.with_index(2){|x| puts x if x < 224} 
11 
22 
31 
44 
=> [11, 22, 31, 224, 44] 

困惑:在這裏,我已經設置。但是,如果我們考慮的輸出 - 的起始偏移量爲2如何11 而不是31。由於31位於2th的位置。混亂與枚舉#with_index - 起始偏移指數

a.with_index(2){|x| puts x if x > 224} 
=> [11, 22, 31, 224, 44] 
a.with_index(1){|x| puts x if x > 224} 
=> [11, 22, 31, 224, 44] 
a.with_index(1){|x| puts x if x < 224} 
11 
22 
31 
44 
=> [11, 22, 31, 224, 44] 
a.with_index(1){|x| puts x if x < 224} 
11 
22 
31 
44 
=> [11, 22, 31, 224, 44] 

困惑:這裏波夫我已經設置了起始偏移量爲1。但如果我們考慮的是如何輸出 - 來自11,而不是22。由於22位於1st的位置。

在考慮所有的事實在一起,我想知道即使我們提到的起始偏移量 - 爲什麼enum#with_index沒有開始評估提到的抵消?

注:是否有任何直接的方式與內容打印index也?

回答

4

Enumerator#with_index令人困惑的文件,但希望這會使它更清楚。

a=[11,22,31,224,44].to_enum 
=> [11, 22, 31, 224, 44] 
a.with_index { |val,index| puts "index: #{index} for #{val}" } 
index: 0 for 11 
index: 1 for 22 
index: 2 for 31 
index: 3 for 224 
index: 4 for 44 

a.with_index(2) { |val,index| puts "index: #{index} for #{val}" } 
index: 2 for 11 
index: 3 for 22 
index: 4 for 31 
index: 5 for 224 
index: 6 for 44 

正如您所看到的,它實際上做的是偏移索引,而不是從給定索引開始迭代。

+0

我也應該起來投票:)因爲我的發現是正確的,只是不能證明自己,但在我的幫助下,我現在做了。 – DoLoveSky

+0

這是一個紅寶石的bug嗎?否則原始數組元素如何改變其位置? – DoLoveSky

+0

數組元素保持相同的順序,他們只是得到一個不同的索引值(但仍然基於提供的偏移量單調)。在您的原始示例中注意,由於您沒有使用索引,因此如果您將#with_index替換爲#each,則所有代碼的行爲都相同 –