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

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

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

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

```ruby
{'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}

# 「キー」をシンボルにして「=>」を省略
{japan: 'yen', us: 'dollar', india: 'rupee'}

# 「値」もシンボルにできる
{japan: :yen, us: :dollar, india: :rupee}
```

**関連記事**
[シンボルとは！？【Ruby超入門】](https://qiita.com/yyykms123/items/6a6ae7fe8cd9263a3d1c)
[配列の基礎的なメソッド集【Ruby超入門】](https://qiita.com/yyykms123/items/e1bcb838f56100d12025)

##ハッシュの基本的な使い方
###「キー」と「値」を追加

```ruby
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
# イタリアの通貨を追加する
currencies['italy'] = 'euro'
p currencies
#=> {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee', 'italy' => 'euro'}
```

**変数`currencies`の「キー」`'italy'`に「値」`euro`を代入するようなイメージ。**

追加した「キー」と「値」の組は末尾に追加されるが、ハッシュでは「キー」を指定して「値」を代入したり取得したりする使い方が多いため、順番を意識することはあまりない。

**また、すでに存在する「キー」を指定した場合は「値」が上書きされる。**

```ruby
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
# すでに存在するjapanを指定
currencies['japan'] = '円'
p currencies
#=> {'japan' => '円', 'us' => 'dollar', 'india' => 'rupee'}
```

###ハッシュから「値」を取り出す

```ruby
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
puts currencies['japan']  #=> yen
```

配列では`[n]`というようにn番目の要素取り出していたが、**ハッシュではインデックス番号ではなく「キー」を指定することで、組となっている「値」を取得する。**

存在しない「キー」を指定すると`nil`を返す。

```ruby
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
puts currencies['italy']  #=> nil
```

###ハッシュから「キー」と「値」の組を削除

**ハッシュから「キー」と「値」の組を削除するときは`delete`メソッドを使う。**
また、戻り値は削除された要素の「値」となり、指定した「キー」がなければ`nil`を返す。

```ruby
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
puts currencies.delete('japan')  #=> yen
p currencies
#=>  {'us' => 'dollar', 'india' => 'rupee'}

puts currencies.delete('japan')  #=> nil
```

###要素数の取得

**`size`メソッドを使うとハッシュの要素の個数を調べることができる。**

```ruby
puts {}.size  #=> 0
puts {'x' => 1, 'y' => 2, 'z' => 3}.size  #=> 3
```

###ハッシュを使った繰り返し処理

**`each`メソッドを使うと「キー」と「値」の組み合わせを格納した順に取り出すことができる。**
ブロック引数が「キー」と「値」で2個になっている点に注意する。

```ruby
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}

currencies.each do |key, value|
  puts "#{key}:#{value}"
end
```
```:実行結果
japan:yen
us:dollar
india:rupee
```

ブロック引数を1つにすると「キー」と「値」が配列に格納される。

```ruby
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`が返る。

```ruby
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
```

##参考書
* [プロを目指す人のためのRuby入門](https://www.amazon.co.jp/gp/product/4774193976/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4774193976&linkCode=as2&tag=ykms1230e-22&linkId=7d182a6724516a0f1a495c33599a4946)
* [ゼロからわかる Ruby 超入門 (かんたんIT基礎講座)](https://www.amazon.co.jp/gp/product/4297101238/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4297101238&linkCode=as2&tag=ykms1230e-22&linkId=16f1470f0d06b61a190643877fd54da0)