Ruby.学習その4

#### 投稿目的
- 個人の学習目的で投稿していきます。
- Rubyの入門を読みながら自分なりの思考で記述しています。

#### 参考資料

[ゼロからわかる Ruby 超入門 (かんたんIT基礎講座)](https://www.amazon.co.jp/ゼロからわかる-Ruby-超入門-かんたんIT基礎講座-五十嵐/dp/4297101238/ref=sr_1_3?ie=UTF8&qid=1549614126&sr=8-3&keywords=ruby+入門)

## オブジェクトを組みで扱う

#### ハッシュ(Hash)
- ハッシュもオブジェクトを扱うがハッシュ自体もオブジェクトです。
- ハッシュのクラス名はHashです。
- キー、値には文字列、整数など様々なオブジェクトを指定できる
- =>記号を利用してキーと値をセットで扱う。
- {で始まり}で終わる、データはカンマ区切りで複数扱える。

##### 配列との違い
- ハッシュも配列と同様でデータを扱うことができるがハッシュの場合は[キー]と[値]をセットで扱うことができる。

```ruby
#    キー名     値    キー名     値
p( {:hash1 => 100, :hash2 => 200}) 
```

###### 補足: pメソッドの()は省略しないで記述することで文法の解釈が曖昧になってエラーになるのを防ぐことができる。

##### シンボル(Symbol)
- 上記で登場した:(シンボル)とは文字列に似ているオブジェクト。
- シンボルも文字列、整数と同じようにオブジェクトの種類1つです
- シンボルのクラス名は(Symbol)です。
- 文字列と似ていても""で囲まず:を先頭に付けて記述するのがシンボルです。
- to_symメソッドを利用することで文字列と相互に変換することができる。

```ruby
p "hash".to_sym # :hash
p :hash.to_s # "hash"
```

##### 2種類の記述
- ハッシュの記述の仕方には2種類の方法があり1つ目は=>記号を利用する記述。
- 2つ目は:をキーと値の間に記述する方法があります。
- 2つ目はキーにシンボルを指定している時にだけ利用できる、文字列など違うオブジェクトの場合は利用できない。

```ruby
p( {:hash => 100, :hash => 200}) # 1つ目
p( {hash1: 100, hash2: 200} ) # 2つ目
```

##### 変数に代入
- ハッシュも配列同様で変数に代入することができる。

```ruby
hash = {hash1: 100, hash2: 200}
```

##### 値を取得
- ハッシュ名に[]の中にキー名を記述することで値を取得することができる。
- シンボルキーの場合は:を忘れずに記述する。

```ruby
hash = {hash1: 100, hash2: 200}
p hash[キー名]
```

##### ハッシュにキーと値を追加
- ハッシュ名で[]の中にキー名で=で値を記述する。
- ハッシュ名[キー名]に=で値を代入するイメージ。
- 末尾にキー名+値のセットで追加される。

```ruby
hash = {hash1: 100, hash2: 200}
hash[:hash3] = 300
p hash # {:hash1=>100, :hash2=>200, :hash3=>300}
```
##### 既存のキーの値を変更
- 同名のキーを持つことはできないので後からすでに存在するキー名を指定して値を記述すると元あるキー名の値が上書きされる。

```ruby
hash = {hash1: 100, hash2: 200}
hash[:hash1] = 150
p hash # {:hash1=>150 <=値が上書きされる, :hash=>200}
```

##### 存在しないキーを指定
- ハッシュから存在しないキーを指定した場合はnilが返ってくる。

```ruby
hash = {hash1: 100, hash2: 200}
p hash[:hash3] # nilが返る
```

- default=メソッドを記述することでnilの代わりにdefaultの値が返ってくる。

```ruby
hash = {hash1: 100, hash2: 200}
hash.default = 0
p menu[:hash3] # nilではなく0が返る
```

##### ハッシュをまとめる(連結)
- ハッシュを1つにまろめて新しいハッシュを作る。
- 2つのハッシュを1つにまとめるにはmergeを利用する。

```ruby 
hash_a = {hash1: 100, hash2: 200}
hash_b = {hash3: 300, hash4: 400, hash5: 500}

hash_new = hashA.merge(hashb)
p hash_new # {:hash1=>100,:hash2=>200,:hash3=>300,:hash4=>400,:hash5=>500,}
```

##### 既存のキーと値の削除
- ハッシュから既存のキー+値を削除するにはdeleteメソッドを利用する。

```ruby
hash = {hash1: 100, hash2: 200}
hash.delete(:hash2)

p hash # {:hash1=> 100}
```

##### 繰り返し処理
- 配列の場合は変数は1つでしたが、ハッシュの場合はキーが存在するので2つ変数を記述することでキー名と値を利用することができる。
- 1つ目の変数にキー、2つ目の変数に値が入る。

```ruby 
hash = {"hash1" => 100, "hash2" => 200}

hash.each do |key, value|
    puts "#{key}には#{value}が入っている"
end 
# 結果: hash1には100が入っている hash2には２００が入っている
```

- キーだけを利用したり、値だけを利用することもできる。
- each_keyメソッドとeach_valueメソッドを利用する。

```ruby
hash = {"hash1" => 100, "hash2" => 200}

hash.each_key do |key|
    puts key
end
# 結果: hash1 hash2
```

- 2つ変数を記述してどちらか一方だけを利用することもできる。

```ruby
hash = {"hash1" => 100, "hash2" => 200}

hash.each do |key, value|
    puts value
end
# 結果: 100 200
```

## メソッド
- メソッドとは名前の付いた処理をするための道具。
- puts, p, each, sumなどはRubyでがあらかじめ用意をしているメソッド。

#### メソッド定義
- 自分でメソッドを作ることもできます。
- メソッドを作ることをメソッドを定義するという。
- メソッドを定義する際は最初にdefを付けて関数名を記述します。
- 処理内容に自分が定義した処理を記述する。
- メソッド名は変数同様、先頭は英字か_で記述、2文字目以降は英字、数字、_で記述することができる。

```ruby
def メソッド名
  処理内容
end
```

##### areaメソッドを定義
- areaメソッドは辺の長さ2の正方形の面積を求める処理を記述する。
- 定義したメソッドはメソッド名を記述することで呼び出すことができる。
- 定義しただけでは中の処理は実行されない。
- 呼び出すことで処理を行う。

##### メソッドの戻り値
- 処理を実行して最後の実行結果が戻り値として呼び出し元へ返る。
- aeraメソッドを呼び出したら戻り値が置き換わって表示される。

```ruby
def area
  puts 2 * 2
end

area # areaメソッドを呼び出している
# 結果: 4 <= areaではこれが戻り値
```

#### 戻り値を変数に代入
- 戻り値は変数に代入する事もできる。

```ruby
 def area
   2 * 2
 end
 
 result = area # 戻り値をresult変数に代入
 puts result 
```

#### 引数を使用してメソッドにオブジェクトを渡す
- ()を利用することで引数を使用することができる。
- 引数を利用することでメソッドにオブジェクトを渡す。
- 引数で渡す事で引数によって結果が変わるのでより高度な処理を定義することができる。

```ruby
def area(x) # 変数xに2が代入されて
    x * x # 変数xの現在の値は2なので2*2の処理となる
end

puts area(2) # 引数に整数オブジェクトで2を渡して
```

- 引数を2つ以上
- 引数を複数記述する場合はカンマで区切る
- 原則として引数の個数はメソッドの定義側と呼び出し元で同数にする必要がある。

```ruby
def area(x, y)  #  x変数に2が代入、y変数に3が代入される
   x * y  #  2 * 3の計算で戻り値は6を返す
end 

puts area(2, 3)  #  引数の2と3をメソッドに渡す
```

#### メソッドを途中で終わらせる
- メソッドを途中で終わらせるにはreturnを利用する。
- returnより後に記述された行は実行されません。

```ruby
def mesoddo
    puts "こんにちは" # この行は実行される
    return
    puts "おはよう"  # returnの後のこの行は実行されない
end
```

- returnは戻り値を指定することもできる。
- 条件が満たされていない場合はreturnの戻り値を返す。

```ruby
def mesoddo(bool)
    x = "おはよう"
    unless bool 
        return x # 条件が満たされてない場合戻り値を返す
    end
    x + "ございます。" # 条件が満たされている場合この行を実行して結果を返す
end
```

#### 引数にデフォルト値を設定
- メソッド定義の際に引数にデフォルト値を設定することができる。
- デフォルト値はメソッドを呼び出した際に引数を省略した際に使用される値。
- 呼び出す際に引数を渡すとデフォルト値は使用されない。

```ruby
def mesoddo(item = 紅茶) # デフォルト値は紅茶を設定
    "#{item}をください"
end

puts mesoddo # 引数を渡してないのでデフォルト値の紅茶を表示
puts mesoddo(お茶) # 引数に2000を渡したのでお茶を表示
```

#### 引数の順番を変えられるキーワード
- ：を付ける事で呼び出し側で順番を変更できる。
- ：を付けた引数の事をキーワード引数という。
- 定義する際に:を付ける事でキーワード引数になる。
- 呼び出す際はキーワードを付けて値を記述する事で順番を気にせずに渡すことができる。
 
```ruby
def dorink(size:, item:)
    "#{size}サイズの#{item}をください"
end

puts dorink("ココア", "L") # ココアサイズのLをください
puts dorink(item: "ココア", size: "L") # Lサイズのココアをください
```

##### キーワード引数にデフォルト値
- キーワード引数でもデフォルト値を設定することができる。
- キーワード引数に設定する際は=は記述しない。

```ruby
def order(item:, size: "M")
    "#{size}サイズの#{item}をください"
end

puts order(item: ココア) # Mサイズのココアをください
puts order(item: ココア, size: "L") # Lサイズのココアをください
```

#### スコープ
- 変数には範囲と寿命が存在するそれをスコープという。
- メソッドは実行が終わるとメソッド内の変数は役目を終えて破棄される。
- メソッド定義内で記述した変数は外で記述した変数と別。
- メソッド内の変数は外は見れない、外の変数はメソッド内を見れない。

```ruby
def scope
    hensuu = "おはよう"
end

scope # おはようと表示される
p hensuu # その名前の変数もメソッドも定義されていないとエラーになる
```

- 逆も同じで外の変数をメソッド内で利用しようとするとエラーになる。

```ruby
hensuu = "おはよう"

def scope
    p hensuu
end

scope # その名前の変数もメソッドも定義されていないとエラーになる 
```