Класс 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
.