Порядок тестирования с использованием хэш-карты - PullRequest
0 голосов
/ 17 октября 2018

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

Travel_Plans = Hash.new
Travel_Plans[4] = "Colorado Springs"
Travel_Plans[1] = "Santa Fe"
Travel_Plans[2] = "Raton"
Travel_Plans[5] = "Denver"
Travel_Plans[3] = "Pueblo"

puts Travel_Plans.sort

Может ли кто-нибудь объяснить, что подразумевается под "Хэш не имеет порядка"?

Если бы вы могли привести простой пример, который был бы великолепен.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Во-первых, утверждение «у пепла нет порядка» на сегодняшний день неверно.Раньше это было верно для действительно старых и устаревших версий Ruby.Похоже, вы выбрали устаревшую информацию, которая на сегодня была бы ненадежной.

Во-вторых, код, который вы указали:

puts Travel_Plans.sort

, не имеет отношения к тому, чтобы показать, что вы хэш Travel_Plansимеет, то есть сохраняет, порядок.То, что вы должны были сделать, чтобы проверить, сохранен ли порядок, это просто сделать:

p Travel_Plans

, что всегда приводило бы к отображению ключей в порядке 4, 1, 2,5, 3, который соответствует порядку, в котором вы присвоили значения ключа для хеша, таким образом, действительно показывает, что хеш сохраняет порядок.

0 голосов
/ 17 октября 2018

Класс Hash Руби представляет "карту хеша" или "словарь значений-ключей" в традиционных терминах.Предполагается, что это структуры, которые обеспечивают быстрый произвольный доступ к отдельным элементам, но сами элементы не имеют внутреннего порядка.

Внутренне Hash Ruby организует элементы в их различные места в памяти, используя метод hashкаждый объект должен обеспечивать использование в качестве ключа.Ruby Hash необычно, если не смехотворно гибок, в том смысле, что объект, любой объект, может использоваться в качестве ключа, и он сохраняется точно как есть.Сравните с JavaScript, где ключи должны быть только строками и строками.

Это означает, что вы можете сделать это:

{ 1 => 'Number One', '1' => 'String One', :one => 'Symbol One', 1.0 => 'Float One }

Там, где есть четыре совершенно разных ключа.

Это в отличие от Array, где упорядочение является важной частью работы массива.Вы не хотите иметь очередь, в которой дела идут в одном порядке, а выходят в другом.

Теперь класс Ruby Hash раньше не имел внутреннего порядка, но из-за массового спроса теперь он сохраняет заказы всроки вставки.То есть первые вставленные элементы являются «первыми».Обычно вы явно не зависите от этого поведения, но оно проявляется, если вы обращаете внимание:

a = { x: '1', y: '2' }
# => {:x=>"1, :y=>"2"}

b = { }
b[:y] = '2'
b[:x] = '1'
b
# => {:y=>"2", :x=>"1"}

Обратите внимание, что порядок ключей в b поменялся местами из-за их вставки вобратный порядок.Они по-прежнему эквивалентны:

a == b
# => true

Когда вы вызываете sort для Hash, вы фактически преобразуете его в массив пар ключ / значение, а затем сортируете каждую из них:

b.sort
# => [[:x, "1"], [:y, "2"]]

Который вы можете преобразовать обратно в Hash, если хотите:

b.sort.to_h
# => {:x=>"1", :y=>"2"}

Так что теперь он "упорядочен" правильно.На практике это редко имеет значение, так как вы будете обращаться к клавишам индивидуально по мере необходимости.b[:x] не имеет значения, где находится клавиша :x, она всегда возвращает правильное значение независимо от того.

Некоторые замечания, касающиеся Ruby:

  • Не использовать Hash.new, вместо этого просто используйте { } для представления пустой структуры Hash.
  • Не используйте заглавные буквы для переменных, они имеют значительное значение в Ruby.Travel_Plans - это константа, а не переменная, потому что она начинается с заглавной буквы.Они зарезервированы для использования ClassName и CONSTANT_NAME.Это должно быть travel_plans.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...