分配和替换之间的区别



给定a = {:a => 'a'},这两行代码有什么区别?

a = {:b => c}
a.replace({:b => c})

参见哈希#替换文档

a = {:a => 'a'}

上行创建一个 Hash 对象并将其存储在变量a中,a是对对象的引用

 a = {:a => 'a'}
 => {:a=>"a"}
 2.0.0p247 :040 > a.object_id
 => 70094303544580
a = {:b => c}

上面执行与第一行相同的操作,但它覆盖了对内存中上一个 Hash 对象的引用

2.0.0p247 :042 > a = {:b => 'c'}
=> {:b=>"c"}
2.0.0p247 :043 > a.object_id
=> 70094303594480

看到object_id不同

最后:

2.0.0p247 :044 > a.replace({b: "d"})
=> {:b=>"d"}
2.0.0p247 :045 > a
=> {:b=>"d"}
2.0.0p247 :046 > a.object_id
=> 70094303594480

使用 replace 我们指的是之前引用的同一对象,但哈希对象的内容现在发生了变化,请参阅object_id保持不变

值不会对变量先前指向的对象执行任何操作,但replace修改对象。

如果你有一段代码指向a,那么将a分配给另一个东西不会改变这一点:

a = {:a => 'a'}
b = a
c = [:bar, a, :baz]
a = {:b => :foo}
b # => {:a => 'a'}
c # => [:bar, {:a => 'a'}, :baz]

replace修改了之前指向a的内容:

a = {:a => 'a'}
b = a
c = [:bar, a, :baz]
a.replace({:b => :foo})
b # => {:b => :foo}
c # => [:bar, {:b => :foo}, :baz]
这会

将一个新对象分配给变量a

a = {:b => c}

虽然这会使用现有哈希并替换/删除现有值:

a.replace({:b => c})

最新更新