池澤といいます。
「要素のない配列の挙動」には何も罪はなく、「配列を2重にしたときの挙動」
に罪があるわけでもない。
真犯人は「xの指しているものは何か」という問題、ということでしょうか。
r = [[], []]
r.each do |x|
if x.empty? <= ここでxはrの要素を指している
x = [""] <=ここでxの指しているものは新しいオブジェクト[""]になった
end
end
つまりもとのrは何も変わっていない。
たださんのヒントのように
x = [""]ではなく x << "" とやると、もとのrの要素が[]から[""]に変わる。
花岡さんのヒントのように
x.object_id をみればxの指しているオブジェクトが変化したことが分かる。
r.map! { |x| x.empty? ? [""] : x} などとやると
期待通りr は [[""], [""]] になります。
eachを使ってはまった感じっぽいですね。
という理解であっているでしょうか。
考えていて面白かったです。