Переменная экземпляра все еще ссылается после 'dup'

У меня есть объект класса, и я хочу продублировать его с помощью dup . Одна из переменных экземпляра - это массив, и кажется, что он ссылается на него. Я думал, что dup на самом деле создал ДУБЛИКАТ.

Вот мой сеанс IRB:

irb(main):094:0> class G
irb(main):095:1> attr_accessor :iv
irb(main):096:1> def initialize
irb(main):097:2> @iv = [1,2,3]
irb(main):098:2> end
irb(main):099:1> end
=> nil

irb(main):100:0> a=G.new
=> #<G:0x27331f8 @iv=[1, 2, 3]>

irb(main):101:0> b=a.dup
=> #<G:0x20e4730 @iv=[1, 2, 3]>

irb(main):103:0> b.iv<<4
=> [1, 2, 3, 4]
irb(main):104:0> a
=> #<G:0x27331f8 @iv=[1, 2, 3, 4]

Я ожидаю, что a останется неизменным, потому что dup создает совершенно новую переменную, а не ссылку.

Также обратите внимание, что если вы замените [1,2,3] скаляром в G :: initialize , dup не будет ссылаться на него .

7
задан M.Babcock 1 January 2012 в 02:18
поделиться