来自c背景我很好奇Ruby中的对象赋值.应对以下对象分配进行哪些考虑(如果有):
class MyClass attr_accessor :a,:b def initialize(a,b) @a = a @b = b end def some_method puts "#{self.a} #{self.b}" end end m = MyClass.new("first","last") n = MyClass.new("pizza","hello") q = n q.some_method
解决方法
如果您熟悉C,那么您可能希望将Ruby中的每个变量(实例或其他变量)视为对另一个对象的引用.因为Ruby中的所有东西都是一个对象,即使是nil,它的类型为NilClass,这在任何情况下都适用.
要确定您引用的对象,可以使用object_id方法进行区分.这与使用&转换为指针类似.在C.
考虑一下:
a = "foo" b = a a.object_id == b.object_id # => true
由于a是对该字符串的引用,而b是a的副本,因此它们实际上是对同一对象的不同引用.
这很重要,因为修改对象的操作会同时影响对该对象的所有引用:
a << "bar" # => "foobar" b # => "foobar"
但是,创建新对象的操作不会修改所有副本:
a += "baz" # => "foobarbaz" b # => "foobar"
Ruby中的许多方法都是由a来识别的!区分就地版本和新版本版本,但情况并非总是如此,因此您必须熟悉每种方法才能确定.
通常,赋值将使用新引用替换旧引用,因此根据经验,=将替换旧引用.这适用于=,– =,|| =,&& =等等.
编辑:根据Phrogz关于使用ObjectSpace._id2ref(object_id)将对象标识符转换为对象的注释进行更新.