Если у вас есть хеш, вы можете добавить к нему элементы, ссылаясь на них по ключу:
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 onRails несколько смущает это, предоставляя 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, !
указывает, что это место операция.