[#48382] Ruby/Gstreamer for Windows — ashbb <ashbbb@...>

こんにちは。

17 messages 2011/09/22
[#48383] Re: Ruby/Gstreamer for Windows — Kouhei Sutou <kou@...> 2011/09/23

須藤です。

[#48385] Re: Ruby/Gstreamer for Windows — ashbb <ashbbb@...> 2011/09/23

須藤さん

[#48392] 要素のない配列の挙動? — 俊(とし) <toshio.otaguro@...>

前略

21 messages 2011/09/24
[#48393] Re: 要素のない配列の挙動? — TADA Tadashi <t@...> 2011/09/24

ただただしです。

[#48394] Re: 要素のない配列の挙動? — 俊(とし) <toshio.otaguro@...> 2011/09/24

ただただし さん

[#48399] Re: 要素のない配列の挙動? — nonta@... 2011/09/24

野田と申します。

[#48400] Re: 要素のない配列の挙動? — 俊(とし) <toshio.otaguro@...> 2011/09/24

皆さま

[ruby-list:48412] Re: 要素のない配列の挙動?

From: 俊(とし) <toshio.otaguro@...>
Date: 2011-09-25 06:27:16 UTC
List: ruby-list #48412
だんさん

ふー,やっとわかりました.何てややこしい!
文字列は配列なので,これも多重配列と同じように考えればよいということ
ですね.

以下は,私なりに納得するために実験してみたスクリプトです.

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 <dan5.ya@gmail.com>:
> だんです。
>
>>> あと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)が指している文字列オブジェクトは、上の例では結局ひとつの同じオブジェクトなので
> それを書き換えてしまえば、全ての配列が中身が書き換わったように見えます。

In This Thread