Help us understand the problem. What is going on with this article?

ハッシュの基本【Ruby超入門】

ハッシュ

ハッシュは複数のデータをまとめて格納できるオブジェクト。
配列と似ているが、「キー」と「値」のセットで複数のデータを扱う。

ハッシュは「キー」を指定することでその「値」を取り出すことができる。

  • ハッシュは{}の中にカンマ区切りで「キー」と「値」の組を複数書いていく。
  • 「キー」の後に=>(ハッシュロケット)を書き、それに続いて「値」を記述する。
  • ハッシュの「キー」と「値」はシンボルにできる。
  • シンボルが「キー」になる場合は=>を省略できるが、:が前後入れ変わる記述となる。
  • 中身が無い場合は空のハッシュができる。
  • 「キー」と「値」には種類の違うオブジェクトを入れられる。
  • 他の言語では連想配列などと呼んだりする。
{'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

参考書

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away