сравнение хэша с хэшем не удалось - PullRequest
0 голосов
/ 14 марта 2019

Сегодня я столкнулся с интересной проблемой: При сортировке массива хэшей происходит сбой с ошибкой comparison of Hash with Hash failed. Пример:

h1 = {a:1, b:2} 
h2 = {a:1, b:3} 
[h1, h2].sort ArgumentError: comparison of Hash with Hash failed

Теперь странная вещь состоит в том, что и ==, и eql? преуспевают нормально.

h1==h2
=> false

h1.eql?(h2)
=> false

Что еще более странно, так это то, что сортировка массива завершается успешно, если хэши совпадают:

h1= {a:1, b:2}
h2= {a:1, b:2}
[h1, h2].sort
=> [{:a=>1, :b=>2}, {:a=>1, :b=>2}]

Я предполагаю, что сортировка массива не использует eql? внутри. Что он использует? Любое объяснение, почему это происходит?

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Сортировка зависит от способности определить, является ли что-то меньшим, большим или равным, что описывается как Comparable .

Хеш не сопоставим и вызывает <=> с двумя возвращаемыми хэшаминоль.

0 голосов
/ 14 марта 2019

Сортировка использует оператор космического корабля <=>. Состояние документы :

... сравнение между a и b и возвращает целое число меньше 0, если b следует за a, 0, когда a и b эквивалентны, или целое число больше 0, когда a следует за b

Когда вы запускаете следующее, он возвращает nil:

{a:1, b:2} <=> {a:1, b:3}
#=> nil

Принимая во внимание, что если вы сделаете то же самое с массивом, вы получите правильный результат:

[1] <=> [2]
#=> -1
[2] <=> [2]
#=> 0
[3] <=> [2]
#=> 1

Следовательно, сортировка не работает, насколько я знаю.

Что касается последнего случая, массива равных хэшей, мне интересно, выполняет ли метод проверку на равенство перед сортировкой. Я посмотрел на источник, хотя не знаю C, так что, возможно, кто-то более знающий может подтвердить или опровергнуть это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...