web-dev-qa-db-ja.com

Rubyで繰り返し処理中に配列を変更するにはどうすればよいですか?

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

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

...そして、たとえば、配列内の各値に3を掛けたいと思います。

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

...私が欲しいものを取得しません(そして、私は配列自体を変更していない理由を理解しています)。

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

82
brad

mapを使用して、古い配列から新しい配列を作成します。

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

つかいます map!配列を適切に変更するには:

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

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

128
Mark Byers

配列を直接変更するには、arr.map! {|item| item*3}を使用します。元の(多くの場合望ましい)ベースの新しい配列を作成するには、arr.map {|item| item*3}を使用します。実際、eachを使用する前に常に考え直します。通常、mapselect、またはinjectのような高階関数があり、それが必要なことを行うからです。 。

17
Chuck
arr.collect! {|item| item * 3}
5
Jeff Richardson