Все объекты в рубине назначаются по ссылке, за исключением True, False, Nil и Fixnums, которые обрабатываются специально.
Вы можете проверить это, глядя на object_id
irb(main):001:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):002:0> b = a
=> [1, 2, 3]
irb(main):003:0> a.object_id == b.object_id
=> true
Чтобы создать копию объекта, используйте .dup
.
irb(main):005:0> b = a.dup
=> [1, 2, 3]
irb(main):006:0> a.object_id == b.object_id
=> false
Для примера, вам нужно глубокое копирование, так что вы можете сделать
Marshal.load(Marshal.dump(hash))
Итак,
irb(main):037:0> a = {a: []}
=> {:a=>[]}
irb(main):038:0> b = Marshal.load(Marshal.dump(a))
=> {:a=>[]}
irb(main):039:0> b[:a] << 1
=> [1]
irb(main):040:0> b
=> {:a=>[1]}
irb(main):041:0> a
=> {:a=>[]}
[может быть полезным] (http://stackoverflow.com/questions/1465569/ruby-how-can-i-copy -a-variable-without-pointing-to-the-same-object) –