配列では順序(番号)をつけて複数のオブジェクトとまとめて管理した.ハッシュでは文字列やシンボルをキーにしてオブジェクトを管理できる.
ハッシュを作成するには [ ] ではなく { }
で囲う.また,オブジェクトを指定するためのキーとそのキーに対応させるオブジェクトを キー => オブジェクト
で指定する.例えば,次のようにして tanaka と takahashi の得点(または売上)を管理できる.なお,4行目の => 70,
の最後の,
は Ruby ではなくてもかまわない(多くの他の言語では最後に,
があるとエラーになる)が,クックパッド株式会社での Ruby コードのスタイル規準 に従えば,最後の,
も入力すべきである.
hash1.rb
# ハッシュを生成する (1) シンボルを使う
scores = {
:tanaka => 80,
:sato => 70,
}
p scores
p scores[:tanaka]
scores[:sato] = 85
p scores[:sato]
p scores
# ハッシュを生成する (2) 文字列を使う
sales = {
"tanaka" => 200,
"sato" => 300,
}
p sales
p sales["tanaka"]
# ハッシュを生成する (3) 数値を使う
profits = {
5 => 1000,
6 => 980,
7 => 1200,
}
p profits
{:tanaka=>80, :sato=>70} 80 85 {:tanaka=>80, :sato=>85} {"tanaka"=>200, "sato"=>300} 200 {5=>1000, 6=>980, 7=>1200}
Ruby のハッシュのキーには :tanaka
のような シンボル,"tanaka"
のような 文字列,5
のような 数値 を使うことができる.中でもシンボルがよく用いられる(文字列よりもシンボルのほうが高速に処理できる(らしい)).
ハッシュの要素を取り出したり,値を変更したりするには次のように記述すれば良い.
hash2.rb
# ハッシュの定義
address = {
:name => "Tanaka",
:zip => "650-0000",
:city => "Kobe",
}
# :name をキーに値を取り出す
p address[:name]
# :zip の値を変更する
address[:zip] = "650-9876"
# :phone を追加する
address[:phone] = "090-1234-5678"
# ハッシュの中身をすべて表示する
p address
"Tanaka" {:name=>"Tanaka", :zip=>"650-9876", :city=>"Kobe", :phone=>"090-1234-5678"}
ハッシュのキーと値を1つずつ取り出してすべての要素に何らかの処理をするような場合は each
メソッドを利用すれば良い.
ハッシュ.each do |キーの変数, 値の変数| 繰り返したい処理 end
hash3.rb
# ハッシュの定義
address = {
:name => "Tanaka",
:zip => "650-0000",
:city => "Kobe",
}
# キーと値を順に表示する
address.each do |key, value|
puts "#{key} : #{value}"
>
name : Tanaka zip : 650-0000 city : Kobe
ハッシュオブジェクトには size
,keys
,values
,has_key
などのメソッドが準備されている.それぞれ次のように記述すれば良い.
hash4.rb
# ハッシュの定義
address = {
:name => "Tanaka",
:zip => "650-0000",
:city => "Kobe",
}
# サイズを取得
p address.size
# キーの一覧を取得
p address.keys
# 値の一覧を取得
p address.values
# キーを持っているかどうかを取得(ture or false)
p address.has_key?(:name)
p address.has_key?(:phone)
3 [:name, :zip, :city] ["Tanaka", "650-0000", "Kobe"] true false