2013-11-26 60 views
2

我知道在Ruby中執行for循環的慣用方法是使用像.each這樣的枚舉器,但我遇到了一個問題:我想迭代Array的子​​集並修改這些元素。調用.map!與子集如ary[0..2].slice(0..2)似乎並沒有這樣做;大概是因爲切片操作員正在創建一個新的數組?如何迭代修改Ruby中的數組子集?

期望的行爲與for而不是迭代器:

iter_ind = [2,3,4] 
my_ary = [1,3,5,7,9,11] 
for j in iter_ind 
    my_ary[j] = my_ary[j] + 1 
    # some other stuff like an exchange operation maybe 
end 
=> [1, 3, 6, 8, 10, 11] 

東西不起作用:

irb(main):032:0> ar[2..4].map! {|el| el = el+1} 
=> [6, 8, 10] 
irb(main):033:0> ar 
=> [1, 3, 5, 7, 9, 11] 
irb(main):034:0> ar.slice(2..4).map! {|el| el = el+1} 
=> [6, 8, 10] 
irb(main):035:0> ar 
=> [1, 3, 5, 7, 9, 11] 
irb(main):036:0> ar[2..4].collect! {|el| el = el+1} 
=> [6, 8, 10] 
irb(main):037:0> ar 
=> [1, 3, 5, 7, 9, 11] 
+0

感謝您的編輯,我必須意外地點擊了建議的標籤。 –

回答

1

可能嘗試以下方法:

?> ary = [1, 3, 5, 7, 9, 11] 
=> [1, 3, 5, 7, 9, 11] 

?> ary.map!.with_index {|item, index| index.between?(2, 4) ? item += 1 : item} 
=> [1, 3, 6, 8, 10, 11] 

?> ary 
=> [1, 3, 6, 8, 10, 11] 
2

試試這個。

在下面的例子中,我實現了一個可以命名爲map_with_index的東西。如果沒有給定的塊返回迭代器,則返回each_with_index。我用它來映射我們的數組。

ary = [1, 3, 5, 7, 9, 11] 
ary.each_with_index.map { |elem, index| index.between?(2, 4) ? elem += 1 : elem } 
# => [1, 3, 6, 8, 10, 11] 
+3

'ary.map.with_index' –

+0

@SergioTulentsev哦,謝謝。它是如此...優雅。 – user2422869

1

你可以使用Array#each_index,如果你不介意引用數組兩次:

ary = [1, 3, 5, 7, 9, 11] 
ary.each_index { |i| ary[i] += 1 if i.between? 2, 4 } 
#=> [1, 3, 6, 8, 10, 11] 

或者,如果你不」我想迭代整個陣列,這也可以工作:

ary = [1, 3, 5, 7, 9, 11] 
ary[2..4] = ary[2..4].map { |el| el + 1 } 
ary 
#=> [1, 3, 6, 8, 10, 11] 
+0

多重參考是否對速度有重要影響? –

+0

在這種情況下它應該更快。 – Stefan