Вставка Hashmap в себя вызывает странное поведение - PullRequest
0 голосов
/ 19 мая 2018

Следующий код создает хэш-карту и размещает ее внутри себя.

hash = {}
hash[hash] = hash
hash.keys.first == hash # true
hash.values.first == hash # true
hash[hash] # nil??
hash.key?(hash) # False
hash[hash.keys.first] # nil???
hash[{}] # nil

Может кто-нибудь объяснить мне эти результаты?Они кажутся очень нелогичными.

1 Ответ

0 голосов
/ 19 мая 2018

Изменяемые объекты (такие как Array и Hash) в основном не подходят для хеш-ключа, если вы можете изменить их.В этом случае хэш был изменен в точке вставки (поскольку он был вставлен в себя!) И поэтому оставлен в неправильном состоянии.

Если это абсолютно необходимо, вы можете использовать Hash#rehash для исправления состояния объекта:

hash = {}
hash[hash] = hash

hash.rehash # !!!!

hash.keys.first == hash # true
hash.values.first == hash # true
hash[hash] #=> {{...}=>{...}}
hash.key?(hash) # true
hash[hash.keys.first] #=> {{...}=>{...}}
hash[{}] # nil
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...