鉴于a = {:a => 'a'}
,这两行代码之间的区别是什么?
a = {:b => c}
a.replace({:b => c})
答案 0 :(得分:2)
请参阅哈希#replace documentation
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我们指的是之前引用的相同对象,但现在更改了Hash对象的内容,请参阅object_id
保持不变
答案 1 :(得分:2)
这会为变量a
指定一个新对象:
a = {:b => c}
虽然它使用现有哈希并替换/删除现有值:
a.replace({:b => c})
答案 2 :(得分:2)
赋值对变量先前指向的对象没有任何作用,但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]