Я немного запутался в назначении объектов и указателях в Ruby и написал этот фрагмент, чтобы проверить свои предположения.
class Foo
attr_accessor :one, :two
def initialize(one, two)
@one = one
@two = two
end
end
bar = Foo.new(1, 2)
beans = bar
puts bar
puts beans
beans.one = 2
puts bar
puts beans
puts beans.one
puts bar.one
Я предполагал, что когда я назначу bar бобам, он создаст копию объекта, и изменение одного не повлияет на другой. Увы, вывод показывает обратное.
^_^[jergason:~]$ ruby test.rb
#<Foo:0x100155c60>
#<Foo:0x100155c60>
#<Foo:0x100155c60>
#<Foo:0x100155c60>
2
2
Я считаю, что числа как-то связаны с адресом объекта, и они одинаковы как для bean-компонентов, так и для bar, и когда я изменяю bean-компоненты, bar также меняется, чего я не ожидал. Похоже, я создаю только указатель на объект, а не его копию. Что мне нужно сделать, чтобы скопировать объект при назначении вместо создания указателя?
Тесты с классом Array также показывают странное поведение.
foo = [0, 1, 2, 3, 4, 5]
baz = foo
puts "foo is #{foo}"
puts "baz is #{baz}"
foo.pop
puts "foo is #{foo}"
puts "baz is #{baz}"
foo += ["a hill of beans is a wonderful thing"]
puts "foo is #{foo}"
puts "baz is #{baz}"
Это приводит к следующему шаткому выводу:
foo is 012345
baz is 012345
foo is 01234
baz is 01234
foo is 01234a hill of beans is a wonderful thing
baz is 01234
Это сводит меня с ума. Вызов pop для foo также влияет на baz, поэтому это не копия, но объединение чего-либо с foo влияет только на foo, а не на baz. Итак, когда я имею дело с исходным объектом, а когда — с копией? В моих собственных классах, как я могу убедиться, что присваивание копируется, а не создает указатели? Помогите этому запутавшемуся парню.