Почему дубликат ключа для хеша на языке ruby ​​не возвращает ошибку?

A. Дубликат ключа со строкой в ​​качестве ключа

irb(main):001:0> myHash = {'a' => 'a', 'a' => 'a'}
(irb):1: warning: key "a" is duplicated and overwritten on line 1

B. Дубликат ключа с массивом в качестве ключа

irb(main):001:0> myHash = {[1,2,3] => [1,2,3], [1,2,3] => [4,5,6]}
=> {[1, 2, 3]=>[4, 5, 6]}

person Ullman    schedule 31.03.2019    source источник
comment
Это предупреждение генерируется во время компиляции. В принципе, я не понимаю, почему эту проверку нельзя выполнить для всех хеш-литералов или, если уж на то пошло, для всех Ruby литеральные объекты. (Обратите внимание, что литерал не определен в ссылке. Плохо.) Например, { a: [1, 'cat', ['dog', ['pig', ..10]]] } является литералом, потому что его значение может быть определено во время компиляции. Напротив, если бы я заменил 'ca' переменной v, это уже не был бы литерал. (продолжение)   -  person Cary Swoveland    schedule 31.03.2019
comment
.. Литералы, очевидно, могут быть довольно большими, поэтому проверка нескольких ключей в хэше может занять очень много времени. Поэтому я предполагаю, что рубиновый монах просто провел произвольную линию на песке. Кстати, я не представил ответа, потому что мой (продолжение) комментарий - просто предположение. Кстати, пока я писал это, моя клавиатура покрылась крошечными разноцветными снежинками, хотя они довольно быстро тают. У кого-нибудь еще возникла такая проблема?   -  person Cary Swoveland    schedule 31.03.2019


Ответы (1)


Для повторяющейся строки в качестве ключа ошибка не выдается, а является предупреждением.

В обоих случаях повторяющийся ключ заменяется одним, так как здесь возвращаются значения {"a"=>"a"} и {[1, 2, 3]=>[4, 5, 6]}.

person Mehreen    schedule 01.04.2019