Положение пар ключ / значение в хэше в Ruby (или любом другом языке)
Я слышал, что позиции пар ключ-значение в хэше не фиксированы и могут быть переставлены.
Я хотел бы знать, правда ли это, и если это так, может ли кто-нибудь указать мне какую-то документацию? Если это неправильно, было бы здорово иметь некоторую документацию об обратном.
Для иллюстрации, если у меня есть следующий хэш:
NUMBERS = {
1000 => "M",
900 => "CM",
500 => "D",
400 => "CD",
100 => "C",
90 => "XC",
50 => "L",
40 => "XL",
10 => "X",
9 => "IX",
5 => "V",
4 => "IV",
1 => "I",
}
и повторять его снова и снова, будет ли первая пара ключ / значение, возможно, не 1000 => 'M'
? Или же позиции пар ключ / значение фиксированы по определению, и их придется менять вручную, чтобы изменить позиции?
Этот вопрос является более общим и основным вопросом о качествах хэшей. Я не спрашиваю, как добраться до определенной позиции в хеше.
2 ответа
Обычно хеши (или словари, ассоциативные массивы и т. Д.) Считаются неупорядоченными структурами данных.
Из Википедии
Кроме того, ассоциативные массивы также могут включать в себя другие операции, такие как определение количества привязок или построение итератора для цикла по всем привязкам. Обычно для такой операции порядок, в котором возвращаются привязки, может быть произвольным.
Однако начиная с Ruby 1.9 хеш-ключи поддерживают порядок, в котором они были вставлены в Ruby.
Ответ находится прямо вверху документации Ruby дляHash
Хэши перечисляют свои значения в том порядке, в котором были вставлены соответствующие ключи.
В Ruby вы можете легко проверить это сами
key_indices = {
1000 => 0,
900 => 1,
500 => 2,
400 => 3,
100 => 4,
90 => 5,
50 => 6,
40 => 7,
10 => 8,
9 => 9,
5 => 10,
4 => 11,
1 => 12
}
1_000_000.times do
key_indices.each_with_index do |key_val, i|
raise if key_val.last != i
end
end
Хеш (также называемый ассоциативным массивом) - это неупорядоченная структура данных. Начиная с Ruby 1.9, Ruby сохраняет порядок ключей, хотя и вставленный.
Вы можете найти намного больше об этом здесь: Гарантирован ли порядок литерала хеша Ruby?
И некоторые здесь https://ruby-doc.org/core-2.4.1/Hash.html