2013-12-23 4 views

ответ

2

См Hash # заменить documentation

a = {:a => 'a'} 

выше строка создает объект хэша и сохраняет его в переменной 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 

С заменить мы имеем в виду тот же объект ранее ссылочного, но содержание Hash объекта теперь изменен, см object_id остается таким же

+0

'Объект # object_id' является хорошим методом для объяснения этого сообщения. Итак ... +1 :) –

+0

Я поражен. Я получил 2 голоса по этому ответу, и никто из них не прокомментировал, почему нужно проголосовать – bjhaid

+0

Я знаю ... это случилось со мной несколько раз ... проигнорируйте эти ... –

2

Этот объект присваивает переменную a:

a = {:b => c} 

в то время как это использует существующий хэш и заменяет/удаляет существующие значения:

a.replace({:b => c}) 
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] 
Смежные вопросы