给定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})