1. ホーム
  2. ruby

[解決済み] Rubyで既存のハッシュに追加する方法

2022-10-30 11:42:58

質問

を追加することに関して key => value のペアを追加することに関して、私はApressのBeginning Rubyを読んでいる最中で、ちょうどハッシュの章を終えたところです。

私は、これが配列で行うのと同じ結果をハッシュで達成する最も簡単な方法を見つけようとしています。

x = [1, 2, 3, 4]
x << 5
p x

どのように解決するのですか?

ハッシュがあれば、キーで参照することで項目を追加することができます。

hash = { }
hash[:a] = 'a'
hash[:a]
# => 'a'

ここで、例えば [ ] は空の配列を作成します。 { } は空のハッシュを作成します。

配列は0個以上の要素を特定の順序で持ち、要素は重複することがあります。ハッシュは0個以上の要素を持ちます。 キーによって構成される キーは重複しないが、その位置に格納される値は重複する可能性がある。

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など、ほぼすべてのものにインデックスを作成することができます。

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の多くのメソッドと同様、このメソッドは ! はそれが インプレース の操作であることを示します。