Если у вас есть хэш, вы можете добавлять в него элементы, ссылаясь на них по ключу:
hash = { }
hash[:a] = 'a'
hash[:a]
# => 'a'
Здесь лайк [ ]
создает пустой массив, { }
создаст пустой хеш.
Массивы содержат ноль или более элементов в определенном порядке, причем элементы могут дублироваться. Хэши содержат ноль или более элементов, упорядоченных по ключу , причем ключи не могут дублироваться, но значения, хранящиеся в этих позициях, могут быть.
Хэши в Ruby очень гибкие и могут иметь ключи практически любого типа, которые вы можете использовать. Это отличает его от словарных структур, которые вы найдете в других языках.
Важно помнить, что часто имеет значение конкретная природа ключа хэша:
hash = { :a => 'a' }
# Fetch with Symbol :a finds the right value
hash[:a]
# => 'a'
# Fetch with the String 'a' finds nothing
hash['a']
# => nil
# Assignment with the key :b adds a new entry
hash[:b] = 'Bee'
# This is then available immediately
hash[:b]
# => "Bee"
# The hash now contains both keys
hash
# => { :a => 'a', :b => 'Bee' }
Ruby on Rails несколько сбивает это с толку, предоставляя HashWithIndifferentAccess, где он может свободно конвертировать между методами адресации Symbol и String.
Вы также можете индексировать практически все, включая классы, числа или другие хэши.
hash = { Object => true, Hash => false }
hash[Object]
# => true
hash[Hash]
# => false
hash[Array]
# => nil
Хэши можно преобразовать в массивы и наоборот:
# Like many things, Hash supports .to_a
{ :a => 'a' }.to_a
# => [[:a, "a"]]
# Hash also has a handy Hash[] method to create new hashes from arrays
Hash[[[:a, "a"]]]
# => {:a=>"a"}
Когда дело доходит до «вставки» вещей в хеш, вы можете делать это по одному или использовать merge
метод для объединения хешей:
{ :a => 'a' }.merge(:b => 'b')
# {:a=>'a',:b=>'b'}
Обратите внимание, что это не изменяет исходный хэш, а вместо этого возвращает новый. Если вы хотите объединить один хеш в другой, вы можете использовать merge!
метод:
hash = { :a => 'a' }
# Returns the result of hash combined with a new hash, but does not alter
# the original hash.
hash.merge(:b => 'b')
# => {:a=>'a',:b=>'b'}
# Nothing has been altered in the original
hash
# => {:a=>'a'}
# Combine the two hashes and store the result in the original
hash.merge!(:b => 'b')
# => {:a=>'a',:b=>'b'}
# Hash has now been altered
hash
# => {:a=>'a',:b=>'b'}
Как и многие методы String и Array, !
указывает, что это операция на месте .