Предположим, у меня есть hash = {1=>1,2=>2}
, чтобы удалить значения, которые я могу сделать либо hash = {}
, либо hash.clear
. В чем разница между ними?В чем разница между инициализацией хэша два раза и ясно?
ответ
В соответствии с docs, если вы видите исходный код для метода clear
, он выполняет итерацию каждого элемента в хеше и удаляет его.
Когда вы сделаете hash = {}
, он просто создаст новый пустой объект хэша, но старый объект все еще будет в памяти, готовой к сборке мусора, если для этого объекта нет других ссылок.
Это отличный ответ. Благодарю. –
Ответ Атри прав, но за пределами Хэша, все еще существующего в памяти для GC, когда вы используете переназначение, - это если массив по-прежнему фактически ссылается на другую переменную.
Hash - это объект, переменная - это просто указатель или ссылка на него. #clear очищает сам объект, переназначая переменную, просто указывает переменную на новый Hash.
hash1 = {1=>1,2=>2}
hash2 = hash1
puts hash1 # => {1=>1,2=>2}
puts hash2 # => {1=>1,2=>2}
hash1 = {}
puts hash1 # => {}
puts hash2 # => {1=>1,2=>2}
hash1 = {1=>1,2=>2}
hash2 = hash1
hash1.clear
puts hash1 # => {}
puts hash2 # => {}
Они совершенно разные.
Первый из них просто привяжет локальную переменную hash
к другому объекту. В частности, он будет не "очистить значения", как Вы утверждаете:
hash = {i: 'am', still: 'there'}
another = hash
hash = {}
another
# => {i: 'am', still: 'there'}
Второй будет фактически очистить значения:
hash = {i: 'am', still: 'there'}
another = hash
hash.clear
another
# => {}
чек здесь для информации Http: // ruby-doc.org/core-2.0.0/Hash.html – LHH
@ LHH, я сделал. Я просто не мог понять, почему я использовал бы #clear, если я могу инициализировать новый хеш, чтобы очистить его. –