From: "俊(とし)" Date: 2011-09-25T15:10:46+09:00 Subject: [ruby-list:48411] Re: 要素のない配列の挙動? にくさん, あいにく,私は Marshal というものを全く知りませんが,言わんとされていることは 何となくわかるような気がします. とにかく,配列の配列になると,最下位より上の配列要素は全てオブジェクトへの 参照になるので,一筋縄ではいかないように思います. 自分なりに試してみようと思い,以下のような実験をしてみました. r = [[1, 2], [3], [4, 5]] p r #=> [[1, 2], [3], [4, 5]] q1 = r.dup q2 = r[0..-1] q3 = r.collect{|x| x.dup} q4 = r.collect{|x| x[0..-1]} r.collect! do |x| x.collect! {|y| y += 1} end p r #=> [[2, 3], [4], [5, 6]] p q1 #=> [[2, 3], [4], [5, 6]] p q2 #=> [[2, 3], [4], [5, 6]] p q3 #=> [[1, 2], [3], [4, 5]] p q4 #=> [[1, 2], [3], [4, 5]] 私は r[0..-1] に関しても,dup に関しても浅い理解してしていなかったようです. -- 俊(とし) 2011年9月25日14:11 -E:), niku : > にくといいます > > Marshal はどうでしょうか. > > inner1 = [1,2,3] > inner2 = [4,5,6] > outer = [inner1, inner2] > cloned = outer.clone > dumped = Marshal.load(Marshal.dump(outer)) > > outer # => [[1, 2, 3], [4, 5, 6]] > cloned # => [[1, 2, 3], [4, 5, 6]] > dumped # => [[1, 2, 3], [4, 5, 6]] > > inner1[0] = "changed" > > inner1 # => ["changed", 2, 3] > outer # => [["changed", 2, 3], [4, 5, 6]] > cloned # => [["changed", 2, 3], [4, 5, 6]] > dumped # => [[1, 2, 3], [4, 5, 6]] > > るりま「値渡しと参照渡しの違いを理解する」の > http://jp.rubyist.net/magazine/?0032-CallByValueAndCallByReference > 「参照の値渡し」も参考になるかもしれません. > > 僕はあんまりこのあたりを覚えていなくて,使おうとすると混乱するので > 個人的にはできるだけ配列への再代入を使わなくてもすむようにプログラミングしています.