分配和替换之间的区别

时间:2013-12-23 11:47:56

标签: ruby hash replace

鉴于a = {:a => 'a'},这两行代码之间的区别是什么?

a = {:b => c}

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

3 个答案:

答案 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]