ハッシュ
ハッシュは複数のデータをまとめて格納できるオブジェクト。
配列と似ているが、「キー」と「値」のセットで複数のデータを扱う。
ハッシュは「キー」を指定することでその「値」を取り出すことができる。
- ハッシュは
{}
の中にカンマ区切りで「キー」と「値」の組を複数書いていく。 - 「キー」の後に
=>
(ハッシュロケット)を書き、それに続いて「値」を記述する。 - ハッシュの「キー」と「値」はシンボルにできる。
- シンボルが「キー」になる場合は
=>
を省略できるが、:
が前後入れ変わる記述となる。 - 中身が無い場合は空のハッシュができる。
- 「キー」と「値」には種類の違うオブジェクトを入れられる。
- 他の言語では連想配列などと呼んだりする。
{'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
# 「キー」をシンボルにして「=>」を省略
{japan: 'yen', us: 'dollar', india: 'rupee'}
# 「値」もシンボルにできる
{japan: :yen, us: :dollar, india: :rupee}
関連記事
シンボルとは!?【Ruby超入門】
配列の基礎的なメソッド集【Ruby超入門】
ハッシュの基本的な使い方
「キー」と「値」を追加
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
# イタリアの通貨を追加する
currencies['italy'] = 'euro'
p currencies
# => {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee', 'italy' => 'euro'}
変数currencies
の「キー」'italy'
に「値」euro
を代入するようなイメージ。
追加した「キー」と「値」の組は末尾に追加されるが、ハッシュでは「キー」を指定して「値」を代入したり取得したりする使い方が多いため、順番を意識することはあまりない。
また、すでに存在する「キー」を指定した場合は「値」が上書きされる。
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
# すでに存在するjapanを指定
currencies['japan'] = '円'
p currencies
# => {'japan' => '円', 'us' => 'dollar', 'india' => 'rupee'}
ハッシュから「値」を取り出す
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
puts currencies['japan'] #=> yen
配列では[n]
というようにn番目の要素取り出していたが、ハッシュではインデックス番号ではなく「キー」を指定することで、組となっている「値」を取得する。
存在しない「キー」を指定するとnil
を返す。
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
puts currencies['italy'] #=> nil
ハッシュから「キー」と「値」の組を削除
ハッシュから「キー」と「値」の組を削除するときはdelete
メソッドを使う。
また、戻り値は削除された要素の「値」となり、指定した「キー」がなければnil
を返す。
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
puts currencies.delete('japan') #=> yen
p currencies
# => {'us' => 'dollar', 'india' => 'rupee'}
puts currencies.delete('japan') #=> nil
要素数の取得
size
メソッドを使うとハッシュの要素の個数を調べることができる。
puts {}.size #=> 0
puts {'x' => 1, 'y' => 2, 'z' => 3}.size #=> 3
ハッシュを使った繰り返し処理
each
メソッドを使うと「キー」と「値」の組み合わせを格納した順に取り出すことができる。
ブロック引数が「キー」と「値」で2個になっている点に注意する。
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
currencies.each do |key, value|
puts "#{key}:#{value}"
end
japan:yen
us:dollar
india:rupee
ブロック引数を1つにすると「キー」と「値」が配列に格納される。
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
currencies.each do |key_value|
key = key_value[0]
value = key_value[1]
puts "#{key}:#{value}"
end
japan:yen
us:dollar
india:rupee
ハッシュの同値比較
==
でハッシュ同士を比較すると、同じハッシュかどうかをチェックできる。
すべての「キー」と「値」が同じであればtrue
が返る。
また、並び順が異なっていてもすべての「キー」と「値」が同じであればtrue
が返る。
a = {'x' => 1, 'y' => 2, 'z' => 3}
b = {'x' => 1, 'y' => 2, 'z' => 3}
puts a == b #=> true
c = {'z' => 3, 'x' => 1, 'y' => 2}
puts a == c #=> true
d = {'x' => 1, 'y' => 20, 'z' => 3}
puts a == d #=> false