web-dev-qa-db-ja.com

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

key => valueペアをRubyの既存のポピュレートされたハッシュに追加することに関して、私はApressのBeginning Rubyの作業を進めており、ハッシュの章を終えました。

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

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

ハッシュがある場合、キーで参照することでアイテムを追加できます:

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' }

Rails上のRubyは、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の多くのメソッドと同様に、!は、それがin-place操作であることを示します。

179
tadman
my_hash = {:a => 5}
my_hash[:key] = "value"
64
robbrit

複数を追加する場合:

hash = {:a => 1, :b => 2}
hash.merge! :c => 3, :d => 4
p hash
33
Josh Kovach
x = {:ca => "Canada", :us => "United States"}
x[:de] = "Germany"
p x
8
Jeremy Roman
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"} 

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

1
Raam
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.
0
ark1980