a = {:a => 'a'}
, какая разница между этими двумя строками кода?Разница между присваиванием и заменой
a = {:b => c}
a.replace({:b => c})
a = {:a => 'a'}
, какая разница между этими двумя строками кода?Разница между присваиванием и заменой
a = {:b => c}
a.replace({:b => c})
См 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
остается таким же
Этот объект присваивает переменную a
:
a = {:b => c}
в то время как это использует существующий хэш и заменяет/удаляет существующие значения:
a.replace({:b => c})
Назначение ничего не делать с объектом, что переменная ранее указывал, но 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]
'Объект # object_id' является хорошим методом для объяснения этого сообщения. Итак ... +1 :) –
Я поражен. Я получил 2 голоса по этому ответу, и никто из них не прокомментировал, почему нужно проголосовать – bjhaid
Я знаю ... это случилось со мной несколько раз ... проигнорируйте эти ... –