Я немного озадачен назначением объектов и указателями в 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
Я предполагал, что когда я назначу бар бинам, он создаст копию объекта, и изменение одного не повлияет на другое. Увы, вывод показывает иначе.
^_^[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. Так, когда я имею дело с оригинальным объектом, и когда я имею дело с копией? В моих собственных классах, как я могу убедиться, что назначение копирует, а не делает указатели? Помогите этому растерянному парню.