1. ホーム
  2. ruby

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

2022-03-05 22:26:24

質問

を追加することに関して key => value のペアを、Rubyで既存のpopulated hashに追加したいのですが、ApressのBeginning Rubyを読んでいる最中で、ちょうどhashの章を終えたところです。

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

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 = { 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"} 

ハッシュへの挿入は、1つずつ行うか、あるいは 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の多くのメソッドと同様に ! であることを示す インプレース の操作になります。