From: "俊(とし)" Date: 2011-09-25T15:27:16+09:00 Subject: [ruby-list:48412] Re: 要素のない配列の挙動? だんさん ふー,やっとわかりました.何てややこしい! 文字列は配列なので,これも多重配列と同じように考えればよいということ ですね. 以下は,私なりに納得するために実験してみたスクリプトです. r = [1, 2, 3] q1 = r.dup q2 = r[0..-1] r.collect!{|x| x += 1} p r #=> [2, 3. 4] p q1 #=> [1, 2. 3] p q2 #=> [1, 2. 3] 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]] -- 俊(とし) 2011年9月25日15:02 Dan Yamamoto : > だんです。 > >>> あとdupやcloneでは、コピーで新しいオブジェクトを作れれますよー。 >> >> るりまの Array#dup のところの例を見ると,ポインタのコピーのように見えるのですが. >> 配列オブジェクトを指すポインタオブジェクトは新しく作られますが(dup と clone で若干差は >> あるようですが),配列オブジェクトそのものは元のものが一つあるだけだと思うのですが. >> >> ary = ['string'] >> p ary #=> ["string"] >> copy = ary.dup >> p copy #=> ["string"] >> >> ary[0][0...3] = '' >> p ary #=> ["ing"] >> p copy #=> ["ing"] > > ややこしいところなのでまずこちらの方にだけ返信しますね。 > > 配列オブジェクトをdup(またはclone)した場合、 > 配列オブジェクト自体がコピーされて新しく作られます。 > ですが配列オブジェクトが指しているオブジェクトはコピーされません。 > > つまり上の ary = ['string'] の例で言うと > 'string'オブジェクトはコピーされないが、'string'オブジェクトを指している > 配列オブジェクト自体はコピーされています。 > ポインタという言葉を使えば、配列オブジェクトはポインタの配列であり、 > そのポインタの配列は新しいオブジェクトとして作られることになります。 > (dupはいわゆる浅いコピーです) > > しかし配列(ary, copy)が指している文字列オブジェクトは、上の例では結局ひとつの同じオブジェクトなので > それを書き換えてしまえば、全ての配列が中身が書き換わったように見えます。