2016-01-18 2 views
1

Предположим, у меня есть hash = {1=>1,2=>2}, чтобы удалить значения, которые я могу сделать либо hash = {}, либо hash.clear. В чем разница между ними?В чем разница между инициализацией хэша два раза и ясно?

+0

чек здесь для информации Http: // ruby-doc.org/core-2.0.0/Hash.html – LHH

+0

@ LHH, я сделал. Я просто не мог понять, почему я использовал бы #clear, если я могу инициализировать новый хеш, чтобы очистить его. –

ответ

1

В соответствии с docs, если вы видите исходный код для метода clear, он выполняет итерацию каждого элемента в хеше и удаляет его.

Когда вы сделаете hash = {}, он просто создаст новый пустой объект хэша, но старый объект все еще будет в памяти, готовой к сборке мусора, если для этого объекта нет других ссылок.

+1

Это отличный ответ. Благодарю. –

0

Ответ Атри прав, но за пределами Хэша, все еще существующего в памяти для 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 # => {} 
1

Они совершенно разные.

Первый из них просто привяжет локальную переменную hash к другому объекту. В частности, он будет не "очистить значения", как Вы утверждаете:

hash = {i: 'am', still: 'there'} 
another = hash 

hash = {} 

another 
# => {i: 'am', still: 'there'} 

Второй будет фактически очистить значения:

hash = {i: 'am', still: 'there'} 
another = hash 

hash.clear 

another 
# => {}