On Wednesday, August 16, 2006, at 1:29 AM, Marcel Molina Jr. wrote:
>On Wed, Aug 16, 2006 at 01:18:21AM +0900, Kevin Olbrich wrote:
>> Using 1.8.4 on OSX.
>>
>> class CopyTest
>>  attr_accessor :one
>> end
>>
>> a = CopyTest.new
>> a.one = [1,2,3,4]
>> b = a.clone
>> a.freeze
>>
>> b.one.each_with_index do |item,index|
>>  b.one.delete_at(index) if item == 2
>> end
>>
>> # this is supposed to delete the first item in the array that matches
>> # instead of all matching items
>>
>> b.one #=> [1,3,4]
>>
>> No surprises so far...
>>
>> a.one #=> [1,3,4]
>>
>> Now that is weird.
>>
>> a #=> #<CopyTest:0x35a4ec @one=[1, 3, 4]>
>> b #=> #<CopyTest:0x348698 @one=[1, 3, 4]>
>>
>> Not the same object, so why does changing one affect the other?
>
>a.instance_variable_get(:@one).object_id
>=> 177242
>b.instance_variable_get(:@one).object_id
>=> 177242
>
>The containing instances aren't the same object but they are
>composed of the
>same array object.
>
>Object#clone copies the instance variables of the object being cloned.
>
>marcel
>--
>Marcel Molina Jr. <marcel / vernix.org>
>

Yeah, one of those things you figure out right after you post it.

It does concern me that after freezing a, I could modify a.one through b.

I can see that one may not want to have 'freeze' be called recursively  
on all instance variables, but it sure did throw me off in this case.

-Kevin


_Kevin
www.sciwerks.com

-- 
Posted with http://DevLists.com.  Sign up and save your mailbox.