Ruby.学習その3

#### 投稿目的
- 個人の学習目的で投稿していきます。
- 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+入門)

## 配列とは？
- 配列とはオブジェクトをまとめて扱うための道具。
- 数値や文字列と同様、配列もオブジェクト。

#### クラス(オブジェクトの種類)
- 整数クラスはInteger
- 浮動小数点数クラスはFloat
- 文字列クラスはString
- 配列クラスはArray

#### 配列
- []の中にオブジェクトを記述することで配列して扱うことができる。
- ,(カンマ)区切りで複数のオブジェクトを記述することができる。
- 配列の中身である個々のオブジェクトを要素という。

```ruby
[オブジェクト1, オブジェクト2, オブジェクト3]
```
- 配列も変数に代入する事で配列名を付けることができる。
- 配列は複数形で名前を付ける。

```ruby
配列名 = [オブジェクト1, オブジェクト2, オブジェクト3]
```

#### 配列の要素を取得
- 配列を作成して要素を取得することができる。
- 配列名に[]で番号を指定することで要素を取得することができる。
- 番号は左から順に0から数えていく。

```ruby
#要素番号     0        1        2
array = [object1, object2, object3]
puts array[0]  #  object1
puts array[1]  #  object2
```

##### 要素を取得するための専用のメソッド
- firstメソッドは[0]と同じ意味を持つ。

```ruby
array.first  #  先頭の要素を取得する
```

- lastメソッドは[-1]と同じ意味を持つ。
 
```ruby
array.last   #  末尾の要素を取得する
```

##### nil
- nilは[何もない]ことを表すオブジェクト。

```ruby
array = [object1, object2]
p array[2]  #  array配列に要素2は存在しないのでnilを返す
```

#### 要素を追加、削除
- メソッドを利用する際基本は[.メソッド名()]で利用することができる。
- ()の中に値を記述する。

##### 末尾に要素を追加
- 配列の末尾へ要素を追加するにはpushメソッドを利用する。

```ruby
array = ["a", "b", "c"]

array.push("d") # ["a", "b", "c", "d"<= 末尾に追加]
```

- << 記号を利用して末尾に要素を追加することもできる。

```ruby
array = ["a", "b", "c"]

array << "d" # ["a", "b", "c", "d"<= 末尾に追加]
```

##### 先頭に要素を追加
- 配列の先頭へ要素を追加するにはunshiftメソッドを利用する。

```ruby
array = ["a", "b", "c"]

array.unshift("d") # ["d"<= 先頭に追加, "a", "b", "c",]
```

##### 末尾の要素を削除
- 配列の末尾の要素を削除するにはpopメソッドを利用する。

```ruby
array = ["a", "b", "c"]

array.pop # ["a", "b"] "c"を削除
```

##### 先頭の要素を削除
- 配列の先頭の要素を削除するにはshiftメソッドを利用する。

```ruby
array = ["a", "b", "c"]

array.shift # [b", "c"] "a"を削除
```

##### 配列を足し算
- 配列を足し算をすると二つを結合させた新しい配列ができる。

```ruby
array1 = [1, 2, 3]
array2 = [4, 5, 6]

p array1 + array2 # [1, 2, 3, 4, 5, 6]
```

##### 配列を引き算
- 配列を引き算すると元の配列から要素を取り除いた新しい配列ができる。
- 配列を引き算すると左辺の配列が返ってくる。
- 左辺と右辺の配列を見比べてどちらにも存在する要素を取り除いて結果を返す
 
```ruby
array1 = [1, 2, 3]
array2 = [3, 5, 1]

p array1 - array2 # [2]
```

#### 配列の繰り返し処理

##### eachメソッド
- eachメソッドは配列の全要素を繰り返し処理するメソッド。
- |(パイプ)で囲ってある部分は変数名でその変数に配列の各要素が繰り返し代入されて実行される。

```ruby
array = [1, 2, 3]

array.each do |aray|
    puts aray
end
```
##### 繰り返し処理を途中で終わらせる
- 繰り返し処理を途中で終わらせるにはbreakを利用する。
- breakの後にifを付けて条件を付けることで[〇〇したら終了]とできる。

```ruby
[1, 2, 3].each do |hensuu|
    break if hensuu == 2  #  hensuuの値が2の場合繰り返し処理を終了する
    puts hensuu
end
```

##### 繰り返し処理をスキップする
- 繰り返し処理をスキップする場合はnextを利用する。
- break同様、後にifを付けて条件が一致した値はスキップされる。

```ruby
[1, 2, 3].each do |hensuu|
    next if hensuu == 2  #  hensuuの値が2の場合処理をスキップする
    puts hensuu
end
```

##### 範囲を指定して繰り返す
- 下記のオブジェクトを利用する事で指定した範囲を繰り返すことができる。
- (3..5)は[3から5まで]の範囲を表すオブジェクトでRangeオブジェクトという。

```ruby
(3..5).each do |hensuu|
    puts hensuu 
end
```

#### 配列の便利なメソッド
- メソッドの機能を調べるのに最適なサイトがリファレンスマニュアル.
- https://docs.ruby-lang.org/ja/

##### 配列の要素数を得る
- 配列の要素数を得るにはsizeメソッドを利用する。

```ruby
puts [1, 2, 3].size # 3
```
##### 配列の全要素の合計、平均、浮動小数を得る
- 配列の全要素の合計を得るにはsumメソッドを利用する。
- sumメソッドはRuby2.4から追加された。

```ruby
puts [2, 4, 6].sum # 12
```

- 平均はsizeメソッドとsumメソッドを利用して求めることができる。

```ruby
array = [1, 2, 3]

puts array.sum / array.size # 2
```

- 浮動小数を求めるにはto_fメソッドを利用する
- メソッドが繋がっている場合は先頭のメソッドから実行される。

``` ruby
a = [1, 1, 3]

puts a.sum.tp_f / a.size # 1.67
```

##### 重複している要素を取り除く
- uniqメソッドは重複している要素を取り除くメソッド。
- 自分自身(array1)の要素は変わらずに重複した要素を取り除いた新しい配列を返す。

```ruby
array1 = [1, 1, 2]
array2 = array1.uniq

p array1 # [1, 1, 2]
p array2 # [1, 2]
```

##### 末尾に!がつくメソッド
- !がつくメソッドは自分自身の配列オブジェクトを変更するかどうかの違い。
- このような変更のことを[破壊的変更]という。

```ruby
array1 = [1, 1, 2]
array2 = array1.uniq!

p array1 # [1, 2] <=自分自身の配列も変わる
p array2 # [1, 2]
```

##### オブジェクトIDを返す
- 破壊的に変更されたかはobject_idというメソッドを使うと分かる。
- object_idメソッドはそれぞれのオブジェクトに割り当てられる識別番(オブジェクトID)を返す。
- !を付けないとオブジェクトIDは違うIDで返ってくる。

```ruby
array1 = [1, 1, 2]
array2 = array1.uniq

p array1.object_id # 70276759668640
p array2.object_id # 70276759668600 
```

- !を付けてオブジェクトIDを表示させると自分自身の配列も変わるのでオブジェクトIDも同じになる。

```ruby
array1 = [1, 1, 2]
array2 = array1.uniq!

p array1.object_id # 70346971785000
p array2.object_id # 70346971785000
```

##### ランダムに要素を取得する
- ランダムに要素を取得するにはsampleメソッドを利用する。

```ruby
puts [1, 2, 3].sample # ランダムで要素一つを取得する
```

##### 昇順に要素を並び換える
- 昇順に要素を並び換えるにはsortメソッドを利用する。

```ruby
p [4, 2, 8].sort # [2, 4, 8]
```

- 文字列の時はabc順に並び換わる。
- 頭の文字が同じ場合は２文字目で判断する。
- 大文字が先で、小文字は後。

```ruby
p ["hitomi", "asuka", "tama"].sort
p ["aya", "asuka", "tama"].sort
p ["aya", "asuka", "Tama"].sort
```

##### 降順に要素を並び換える
- 降順に要素を並び換えるにはreverseメソッドを利用する。

```ruby
p [4, 2, 8].reverse # [8, 4, 2]
```

- reverseもsort同じで文字列も並び換えることができる。
- 文字列を並び換えるルールもsortと同じ。

```ruby
p "abc".reverse #=> "cba"
```

##### ランダムに要素を並び換える
- ランダムに要素を並び換えるにはshuffleメソッドを利用する。

```ruby
p [1, 2, 3].shuffle # ランダム配列の中身が並び換わる
```

##### 配列と文字列を連結
- 配列と文字列を連結させるにはjoinメソッドを利用するのが最適。
- joinメソッドで()を付けて引数を渡すことで要素の間に入る文字を指定することができる。

```ruby
puts ["abc", "def", "ghi"].join("と")  #=> "abcとdefとghi"
```

##### 文字列を分割して配列にする
- 文字列を配列にするにはsplitメソッドを利用する。
- splitメソッドは区切り文字で分割して配列にする。

```ruby
p "カフェラテ チーズケーキ バニラアイス".split
```

###### 補足: メソッドへ()に記述して渡すオブジェクトのことを引数という.

##### 配列の各要素を変換
- mapメソッドは配列の各要素へ処理を行い、変換してできた要素を持った新しい配列を作るメソッド。
- この例の場合は各要素に2を乗算した値を返す。

```ruby
array = [1, 2, 3].map do |x|
    x * 2 # [2, 4, 6]
end
```

- 他の種類のオブジェクトへ変換することもできる。

```ruby
array = [100, 200, 300].map do |x|
    "#{x}円" # ["100円", "200円", "300円"]
end
```