From: "Shota Fukumori (sora_h)" Date: 2011-09-25T10:34:11+09:00 Subject: [ruby-list:48402] Re: 要素のない配列の挙動? sora_hです. On 9/25/11 9:21 AM, dezawa wrote: > r.each do |x| > if x.empty? > x = [""] # <== ここで、 > > end > } > > x(すなわち r の要素)に 新しい object [""] が作られて代入されたのです その言い方だと誤解が含まれるので補足します. r.each do |x| ... end で変数 x には r の要素が入っています. しかし,x は要素が入っているだけで変数であるので,x = [""] を実行すると 入っている r の要素から新しく [""] が x に代入されました.なので,変数 x にあった r の要素への参照から,新しく作られた [""] への参照に変更された ということです. 配列を別の中身に入れ替えるためには,Array#replace を用いて r.each do |x| if x.empty? x.replace([""]) end end とすることも可能です. また,すでに言及されていますが Array#map (実態は Enumerable モジュールか らインクルードされているため Enumerable#map になりますが), Array#map! (Array#map の破壊的メソッド[1]) を用いることで実現することも可能です. p r.map {|x| if x.empty?; [""]; else; x; end } #=> [[""],[""]] p r #=> [[],[]] # Array#map! (破壊的メソッド) を利用する p r.map! {|x| if x.empty?; [""]; else; x; end } #=> [[""],[""]] p r #=> [[""],[""]] [1] 破壊的メソッドというのは,参照を変更せずその参照しているオブジェクト そのものを変更することです. -- Shota Fukumori a.k.a. sora_h - http://sorah.jp/