Rubyのシンタックス勉強用（ハッシュ 編）

Rubyのシンタックスを息を吸うように書くために、少しでも理解が怪しいシンタックスを繰り返したくために書きます。

# 前提知識

- ハッシュは、`key`と`value`の組み合わせからなるオブジェクト
- JavaScriptでいう連想配列のようなもの
- Rubyでいうハッシュのクラスは`Hash`

```rb
val = {}
p val.class

=> Hash
```

- 特徴: `key`と`value`が大量に格納されている場合でも指定した`key`に対する`value`を高速で取得できます
- 存在しない`key`を指定すると`nil`がかえってきます

```rb
languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }
p languages['java']

=> nil
```

## 前提知識 / ハッシュのリテラル

書き方は以下のような感じ、最後にカンマがついてもエラーにはならない
同じキーが複数回使われた場合は最後のキーが優先されます（CSSみたいですね）
ですが、そんな書き方は現場ではしないほうがいいと思います

```rb
languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django' }
p languages

=> {"ruby"=>"rails", "php"=>"laravel", "python"=>"django"}

languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }
p languages

=> {"ruby"=>"rails", "php"=>"laravel", "python"=>"django"}
```

# ハッシュの追加

上で定義した変数 `languages` に新たな`key` & `value`ペアをハッシュに追加してください。

return 例

```
{"ruby"=>"rails", "php"=>"laravel", "python"=>"django", "javascript"=>"react"}
```

## 正解

```ruby
languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }
languages['javascript'] = 'react'
p languages
```

参考: [プロを目指す人のためのRuby入門_148p](https://ruby-book.jnito.com/)

# ハッシュの上書き

上で定義した変数 `language` に新たな`key` & `value`ペアをハッシュに追加して
さらに、既存の`key`に対して、新たに`value`を上書きする処理を書いてください。

return 例

```
{"ruby"=>"rails", "php"=>"laravel", "python"=>"django", "javascript"=>"vue.js"}
```

## 正解

```ruby
languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }
languages['javascript'] = 'react'
p languages
languages['javascript'] = 'vue.js'
p languages
```

参考: [プロを目指す人のためのRuby入門_148p](https://ruby-book.jnito.com/)

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

ハッシュに`each`メソッドを使うと以下のような特徴がある

- 引数を2つ用意すれば`key`と`value`を取り出せる
- `key`と`value`のセットは格納した順番に取り出せる

## ハッシュを使った繰り返し処理 / 第1問

以下のような return 例を実現するプログラムを書いてね

```
"ruby => rails"
"php => laravel"
"python => django"
```

## 正解

```ruby
languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }

languages.each do |k,v|
  p "#{k} => #{v}"
end
```

## ハッシュを使った繰り返し処理 / 第２問

以下のような return 例を実現するプログラムを書いてね

```
"[\"ruby\", \"rails\"]"
"ruby"
"rails"
"[\"php\", \"laravel\"]"
"php"
"laravel"
"[\"python\", \"django\"]"
"python"
"django"
```

## 正解

```ruby
languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }

languages.each do |kv|
  p "#{kv}"
  p kv[0]
  p kv[1]
end
```

参考: [プロを目指す人のためのRuby入門_149p](https://ruby-book.jnito.com/)

# ハッシュの同値比較

ハッシュを同値比較させて`true`出力させてください

## 正解

```ruby
languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }
programming_languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }
p languages == programming_languages

=> true
```

参考: [プロを目指す人のためのRuby入門_150p](https://ruby-book.jnito.com/)

# ハッシュの要素数の取得

ハッシュの要素数の取得するようなプログラムを書いてください。

## 正解

```ruby
languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }
p languages.size
p languages.length

=> 3
=> 3
```

参考: [プロを目指す人のためのRuby入門_150p](https://ruby-book.jnito.com/)

# ハッシュの要素の削除

## ハッシュの要素の削除 / 問題1

特定の`key`を削除するようなメソッドを利用して
以下のような return 例を実現するプログラムを書いてね

```
{"php"=>"laravel", "python"=>"django"}
```

## 正解

```ruby
languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }
languages.delete('ruby')
p languages
```

## ハッシュの要素の削除 / 問題2

特定の`key`した後に、削除した要素を取得しようして、`nil`を出力させてください。

## 正解

```ruby
languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }
languages.delete('ruby')
p languages['ruby']

=> nil
```

## ハッシュの要素の削除 / 問題3

特定の`key`を削除したハッシュをブロックに渡した戻り値は、削除した`key`の`value`であることを証明するプログラムを書いてね。

## 正解

```ruby
languages = { 'ruby' => 'rails', 'php' => 'laravel', 'python' => 'django', }
p languages.delete('ruby') { |v| "#{v}" }

=> "rails"
```

参考: [プロを目指す人のためのRuby入門_150p](https://ruby-book.jnito.com/)