2011年9月25日

[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/


投稿者 xml-rpc : 2011年9月25日 10:34
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/106557
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。