Rubyで既存のハッシュに追加する方法


102

key => valueRubyの既存の入力済みハッシュにペアを追加することに関して、私はApressのBeginning Rubyに取り組んでいる最中で、ハッシュの章を終えました。

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

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

回答:


188

ハッシュがある場合は、キーで参照して項目を追加できます。

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

ここで[ ]は、空の配列{ }を作成するように、空のハッシュを作成します。

配列には、特定の順序で0個以上の要素があり、要素が重複する場合があります。ハッシュには0個以上の要素がkey編成されています。キーは複製できませんが、それらの位置に格納されている値は重複できます。

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


12
貴重な情報はたくさんありますが、@ robbritが単純に答えた最も基本的な定式化が欠けています。
danh 2013

1
回答を編集して、質問された質問に実際に回答してください。あなたのためにそれをするのは失礼だ。
Stephan

@Stephanより簡潔な例を上部に追加しました。
tadman 2014



8
x = {:ca => "Canada", :us => "United States"}
x[:de] = "Germany"
p x

これを次のように実装しようとしましたx['key'] = "value"が、エラーが発生します。文字列で作業していることを述べておきます。
トム

1
エラーは何ですか?より具体的でない限り、何でもかまいません。
tadman

1
hash = { a: 'a', b: 'b' }
 => {:a=>"a", :b=>"b"}
hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

マージされた値を返します。

hash
 => {:a=>"a", :b=>"b"} 

ただし、呼び出し元オブジェクトは変更しません

hash = hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 
hash
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

再割り当てはトリックを行います。


0
hash {}
hash[:a] = 'a'
hash[:b] = 'b'
hash = {:a => 'a' , :b = > b}

ユーザー入力からキーと値を取得する場合があるため、Rubyを使用できます。.to_sym は文字列をシンボルに変換でき、.to_iは文字列を整数に変換します。
例えば:

movies ={}
movie = gets.chomp
rating = gets.chomp
movies[movie.to_sym] = rating.to_int
# movie will convert to a symbol as a key in our hash, and 
# rating will be an integer as a value.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.