【发布时间】:2011-02-07 18:35:03
【问题描述】:
我对 Ruby 中的对象分配和指针有点困惑,并编写了这个 sn-p 代码来测试我的假设。
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 分配给 beans 时,它会创建对象的副本,并且修改一个不会影响另一个。唉,输出显示不是这样。
^_^[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
这让我大吃一惊。在 foo 上调用 pop 也会影响 baz,因此它不是副本,但是将某些内容连接到 foo 上只会影响 foo,而不影响 baz。那么我什么时候处理原始对象,什么时候处理副本?在我自己的课程中,我怎样才能确保作业复制,并且不做指针?帮助这个困惑的家伙。
【问题讨论】:
标签: ruby object copy variable-assignment