配列による管理の限界
配列は複数の情報を順番で管理することは得意
複数の情報同士の関係性を示すことには向いていない
関係のある複数の値を管理するときには、ハッシュを用いる
ハッシュ
「データ」とそれに対応する「名前」のセットを要素として持つ値
ハッシュにおいては、データをバリュー、それに対応する名前をキーと呼ぶ
ハッシュは順番ではなく、キーで管理する(キーバリューストア)
ハッシュを用いれば、別々の意味を持つ値を1つにまとめられるため、値同士の関連を示すことができる
# ハッシュの宣言
変数 = {}
# ハッシュの生成は以下のようにハッシュロケット=>を用いてキーとバリューをセットにして記述
変数 = { キー1 => バリュー1, キー2 => バリュー2, キー3 => バリュー3 }
シンボル
見た目は文字列のようだが、実際の中身は数値になっている値
シンボルの宣言は、文字列の先頭にコロン:をつける
シンボルをハッシュのキーに用いる場合は、文字列をキーにする場合と同じ書き方と、
シンボルをキーにするときだけ使用できる書き方の2種類がある
# シンボルの宣言
# 以下はどちらも同じ値
:"文字列"
:文字列 # よく使用される
# 以下はどちらも同じ要素
hash = { :name => "Taro" }
hash = { name: "Taro" } # よく使用される
# 例
student = { "name" => "John", "age" => 10 }
teacher = { name: "Mike", age: 25 }
puts student
puts teacher
ハッシュに値を追加
配列で添字を指定するように角括弧[]の中にキーを記述し、値を代入
# ハッシュへ要素を追加
ハッシュ[追加するキー] = 値
# 例
student = { "name" => "John", "age" => 10 }
teacher = { name: "Mike", age: 25 }
teacher[:subject] = "English"
puts student
puts teacher
ハッシュの値を取得
取得の際に使うのはその値に対応するキー
配列では添字を指定していたが、ハッシュではキーを指定
# ハッシュの要素を取得
ハッシュ[取得したい値のキー]
# 例
student = { "name" => "John", "age" => 10 }
teacher = { name: "Mike", age: 25 }
teacher[:subject] = "English"
puts student
puts teacher
puts teacher[:name]
# puts teacher[:name]でMikeが出力される
# 指定したキーに対応する値が取得できる
ハッシュの値を変更
要素を追加するときと同様に、取得の記述に代入演算子で値を代入するように記述
指定するキーがハッシュに含まれていれば、そのキーに対応する値を変更
存在しないキーであれば、そのキーと値が新しい要素として追加
# ハッシュの要素を変更
ハッシュ[変更したい値のキー] = 値
# 例
student = { "name" => "John", "age" => 10 }
teacher = { name: "Mike", age: 25 }
teacher[:subject] = "English"
teacher[:name] = "Emma"
puts student
puts teacher
puts teacher[:name]
# 名前を持つキーnameの値がMikeからEmmaに変更され、
# puts teacher[:name]の出力は「Emma」になる
ハッシュによる管理の限界
「名前」「年齢」という同じ構造のまとまり自体が増えていくと、ハッシュを代入する変数を増やすことになり、hash1, hash2, ...のような変数名に番号がつく無駄の多い管理になってしまう
ハッシュを利用して複数の変数をまとめても、そのハッシュ自身を代入する変数が増えてしまい本末転倒
そこで配列と組み合わせて値を管理する(配列の要素にハッシュを追加して管理する)
# からの配列を作成する
students = []
# 空の配列studentsにハッシュを追加する
students << {name: "太郎くん", height: 160}
students << {name: "花子さん", height: 155}
students << {name: "次郎くん", height: 165}
students << {name: "春子さん", height: 150}
puts students[1][:name]
# 配列の添字[1]{name: "花子さん", height: 155}のなかの、name:を指定しているので
# 値の、花子さんと出力される