Rubyで配列を反復処理しているときに、配列を変更するにはどうすればよいですか?


88

私はRubyを学んでいるだけなので、これがこの辺りでは初心者すぎる場合はお詫びしますが、つるはしの本からこれを理解することはできません(おそらく十分に注意深く読んでいないだけです)。とにかく、私がそのような配列を持っている場合:

arr = [1,2,3,4,5]

...そして、たとえば、配列の各値に3を掛けたいのですが、次のようにして解決しました。

arr.each {|item| item *= 3}

...必要なものが得られません(そして、その理由を理解しています。配列自体を変更していません)。

私が得られないのは、イテレータの後にコードブロック内から元の配列を変更する方法です。これはとても簡単だと思います。

回答:


140

map古い配列から新しい配列を作成するために使用します。

arr2 = arr.map {|item| item * 3}

map!アレイを所定の位置に変更するために使用します。

arr.map! {|item| item * 3}

オンラインで動作することを確認してください:ideone


2
本当に各要素を変更する必要がある場合は、マップを使用する方が間違いなくよりエレガントです。
fresskoma 2009年

2
また、配列自体を変更する場合は、マップを使用してください。代わりに
Yoann Le Touche

18

配列を直接変更するには、を使用しますarr.map! {|item| item*3}。元の配列に基づいて新しい配列を作成するには(多くの場合、これが望ましい)、を使用しますarr.map {|item| item*3}。実際、私はいつも、を使用する前によく考えますeach。なぜなら、通常、のような高階関数がmapあるselectinject、それが私が望むことをするからです。


列挙操作を実行したくない場合はどうなりますか?arr.map!{ destructive_op}恒久的に変更したいだけの場合はどうなりますarrか?
明るい星

1
@TrevorAlexander:どういう意味かわかりません。詳細などを盛り込んだ実際の質問として質問する価値があるかもしれません。
チャック

私はそれについて考えなければなりません。非常に狭い要素の変更以外に、構造に対するどのような破壊的な操作を列挙できませんか?
明るい星

@TrevorAlexander:私はまだ理解するのに苦労しています。構造体の内容を見ることができない場合、その内容を変換することはできません。構造を変更することに興味がなく、代わりに変数を割り当てたいだけのように聞こえますが、誤解している可能性があります。
チャック

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.