2011年9月25日

[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 <niku@xxxxx>:
> にくといいます
>
> 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
> 「参照の値渡し」も参考になるかもしれません.
>
> 僕はあんまりこのあたりを覚えていなくて,使おうとすると混乱するので
> 個人的にはできるだけ配列への再代入を使わなくてもすむようにプログラミングしています.


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




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