В ruby, почему Set неупорядочен, а Hash гарантирован в порядке вставки? - PullRequest
0 голосов
/ 01 июля 2018

Хэш в рубине 2.5.1 :

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

Набор в рубине 2.5.1 :

Set реализует коллекцию неупорядоченных значений без дубликатов.

Я думал, что set был реализован как хэш в ruby. Тогда почему Set неупорядочен, а хеш гарантирован в порядке вставки?

UPDATE:

Я понимаю, что математически множества должны быть неупорядоченными.

Возникает важный вопрос, хотя класс Set фактически находится в порядке вставки, он не задокументирован. Я думаю, что документация должна быть обновлена.

Даже в источнике Set#add мы видим, что он на самом деле использует Hash:

# File set.rb, line 348

def add(o)
  @hash[o] = true
  self
end

Примечание: Я не хочу вызывать обсуждение, но думаю, что важно, чтобы этот факт был где-то задокументирован. Если нет в официальных документах, по крайней мере, переполнение стека.

1 Ответ

0 голосов
/ 01 июля 2018

Набор семантически неупорядочен; совместимая реализация может построить его поверх фактически неупорядоченного ядра. (Я не уверен, например, что делает JRuby, хотя я думаю, что они, вероятно, используют ту же реализацию на основе Hash, что и CRuby.)

Как вы заметили, Set на практике реализован с использованием Hash - это означает, что он фактически сохранит порядок вставки ... это просто не гарантируется спецификацией.

Если вы спрашиваете, почему это определено таким образом, вполне возможно, что документация предшествует гарантированному порядку хеширования и никогда не пересматривается (и в равной степени возможно, что это осознанный выбор). Недавно он был поднят в https://bugs.ruby -lang.org / Issues / 14069 , но до сих пор не обсуждался.

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