Asignación de objetos y punteros

Estoy un poco confundido sobre la asignación de objetos y los punteros en Ruby, y codifiqué este fragmento para probar mis suposiciones.

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

Supuse que cuando asignaba barra a beans, crearía una copia del objeto, y modificar uno no afectaría al otro. Por desgracia, la salida muestra lo contrario.

^_^[jergason:~]$ ruby test.rb 
#<Foo:0x100155c60>
#<Foo:0x100155c60>
#<Foo:0x100155c60>
#<Foo:0x100155c60>
2
2

Creo que los números tienen algo que ver con la dirección del objeto, y son los mismos para los beans y la barra, y cuando modifico los beans, la barra también cambia, que no es lo que esperaba. Parece que solo estoy creando un puntero al objeto, no una copia del mismo. ¿Qué debo hacer para copiar el objeto en la asignación, en lugar de crear un puntero?

Las pruebas con la clase Array también muestran un comportamiento extraño.

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}"

Esto produce la siguiente salida inestable:

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

Esto me deja boquiabierto. Llamar a pop en foo también afecta a baz, por lo que no es una copia, pero la concatenación de algo en foo solo afecta a foo y no a baz. Entonces, ¿cuándo estoy tratando con el objeto original y cuándo estoy tratando con una copia? En mis propias clases, ¿cómo puedo asegurarme de que la tarea copia y no hace punteros? Ayuda a este tipo confundido.

Respuestas a la pregunta(4)

Su respuesta a la pregunta