Jeśli masz hash, możesz dodać do niego elementy, odwołując się do nich za pomocą klucza:
hash = { }
hash[:a] = 'a'
hash[:a]
# => 'a'
Tutaj, podobnie jak [ ]
tworzy pustą tablicę, { }
utworzy pusty hash.
Tablice mają zero lub więcej elementów w określonej kolejności, w której elementy mogą być zduplikowane. Hashe mają zero lub więcej elementów zorganizowanych według klucza , przy czym klucze nie mogą być zduplikowane, ale wartości przechowywane w tych pozycjach mogą być.
Hashe w Rubim są bardzo elastyczne i mogą mieć klucze niemal każdego typu, jakie możesz w niego rzucić. To sprawia, że różni się od struktur słownikowych, które można znaleźć w innych językach.
Należy pamiętać, że często ważna jest specyfika klucza haszu:
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 nieco to myli, udostępniając HashWithIndifferentAccess, w którym będzie swobodnie konwertować między metodami adresowania Symbol i String.
Możesz także indeksować prawie wszystko, w tym klasy, liczby lub inne skróty.
hash = { Object => true, Hash => false }
hash[Object]
# => true
hash[Hash]
# => false
hash[Array]
# => nil
Hashe można konwertować na tablice i odwrotnie:
# 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"}
Jeśli chodzi o „wstawianie” rzeczy do skrótu, możesz to robić pojedynczo lub użyć merge
metody łączenia skrótów:
{ :a => 'a' }.merge(:b => 'b')
# {:a=>'a',:b=>'b'}
Zauważ, że nie zmienia to pierwotnego skrótu, ale zamiast tego zwraca nowy. Jeśli chcesz połączyć jeden hash w inny, możesz użyć merge!
metody:
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'}
Podobnie jak wiele metod w String i Array, the !
wskazuje, że jest to operacja w miejscu .