【Ruby】初心者がるりまを読んで初めて知ったメソッドをまとめてみる～Array～

最近るりまを読んでいるので、学習したメソッドから有用そうなものをまとめていこうと思います
たのしいRubyを読み終わったあたりの初心者が対象の記事です

#Arrayクラス
###eql?(other) -> bool
`self`と`other`を比較する

普段使うなら`==`で事足りるが、`1`と`1.0`を区別するといった場合に有用である

###fetch(nth) -> object
`nth`の要素を返す

`[]`と違うのは、要素がなかった場合の挙動である
1. 第二引数を与えているとその値を返す
2. ブロックを与えていると`nth`をブロック変数としてブロックを評価しその戻り値を返す
3. どちらもなければ例外発生

if文を書かなくも様々な対応ができる素晴らしいメソッドだ

###dig(idx, ...) -> object | nil
ネストしたオブジェクトを参照して返す

`[]`を連続して使うのと結果は殆ど同じだが、見栄えが良くなる

~~~Ruby
ary = [["a", ["b", "c"]]]

ary[0][1][1]     #=> "c"
ary.dig(0, 1, 1) #=> "c"
~~~

また`dig`は`[]`と違い、一つでも存在しない要素があるとそこで`nil`を返し、残りの引数は評価されない

~~~Ruby
ary = [
       ["相川", 21, ["福岡", "北九州"]],
       ["川村", 19]
  ]

ary[1][2][1]     #=> undefined method `[]' for nil:NilClass (NoMethodError)
ary.dig(1, 2, 1) #=> nil
~~~

長さが不確定な配列の配列を扱う場合に便利だ

###values_at(*selectors) -> Array
`selectors`のインデックスに対応する要素を配列で返す
`selectors`は整数か整数の範囲オブジェクトで指定する

~~~Ruby
ary = %w[a b c d]

ary.values_at(0, 2, 3) #=> ["a", "c", "d"]
ary.values_at(0..2)    #=> ["a", "b", "c"]
~~~

###assoc(key) -> Array | nil
selfを配列の配列と仮定して`[0]`が`key`と等しい最初の配列を返す

元々はハッシュのような配列のためのメソッドだが、特殊な形式の配列に使えるだろう

~~~Ruby
ary = [["a", 1], ["b", 2]]

ary.assoc("b") #=>["b", 2]
~~~

`[1]`を検索する [rassoc](https://docs.ruby-lang.org/ja/latest/method/Array/i/rassoc.html) もある

###rindex(val) -> Integer | nil
`val`と等しい最後の要素を返す

[index](https://docs.ruby-lang.org/ja/latest/method/Array/i/find_index.html) に対応するメソッドである

~~~Ruby
ary = %w[a b a]

ary.index("a")  #=> 0
ary.rindex("a") #=> 2
~~~

###bsearch { |x| ... } -> object | nil
二分探索をする

有用そう（希望的観測）

###delete_at(pos) -> object | nil
インデックスで`delete`する

~~~Ruby
ary = %w[a b c]

ary.delete_at(0) #=> "a"
ary              #=>["b", "c"]
~~~

###delete_if {|x| ... } -> self
ブロックの評価が真(`nil`, `false`以外)になった要素を削除する

[reject!](https://docs.ruby-lang.org/ja/latest/method/Array/i/delete_if.html) と違い、変化がなくても`self`を返すので中々便利

~~~Ruby
ary = [4, 2, 6]

ary.reject! { |x| x.odd? }.sort #=> undefined method `sort' for nil:NilClass (NoMethodError)
~~~

~~~Ruby
ary = [4, 2, 6]

ary.delete_if { |x| x.odd? }.sort #=> [2, 4, 6]
~~~

ブロックの評価が偽になった要素を削除する [keep_if](https://docs.ruby-lang.org/ja/3.0.0/method/Array/i/keep_if.html) もある

###drop(n) -> Array
先頭からn個の要素を削除して残った配列を返す
削除した要素を返す [shift](https://docs.ruby-lang.org/ja/latest/method/Array/i/shift.html) と違い、残った要素を返すので使い分けができるだろう

ブロックで判定を行う [drop_while](https://docs.ruby-lang.org/ja/3.0.0/method/Array/i/drop_while.html) もある

###dup -> Array
`self`のコピーの配列を返す

レシーバと戻り値は別のオブジェクトだが、要素は同じオブジェクトを参照している
完全なコピーを作るには [Marshalモジュール](https://docs.ruby-lang.org/ja/latest/class/Marshal.html) を使うのがよいだろう

※配列の要素が`Integer`などのイミュータブルなオブジェクトであれば`dup`で問題無い

###sample -> object | nil
`self`からランダムな要素を一つ返す
引数を与えた場合(たとえ1でも)その個数のランダムな要素を配列で返す

###reverse_each {|item| ... } -> self
selfを逆順にブロック変数に代入しブロックを実行する
見た目では`reverse.each {|item| ...}`とほぼ変わらないが、より処理効率が良い

###zip(*lists) -> [[object]]
`self`と`lists`の各要素からなる配列の配列を生成して返す

~~~Ruby
ary1 = [1, 2, 3]
ary2 = [4, 5, 6]

ary1.zip(ary2) #=> [[1, 4], [2, 5], [3, 6]]
~~~
ブロックを与えると`zip`した結果の配列でイテレートする



###rotate(cnt = 1) -> Array
`cnt`の位置の要素を先頭として要素を回転させた配列を返す

~~~Ruby
ary = %w[a b c d]
ary.rotate    #=> ["b", "c", "d", "a"]
ary.rotate(2) #=> ["c", "d", "a", "b"]
~~~
破壊的な`rotate!`もある

###flatten(lv = nil) -> Array
`self`を平坦化した配列を返す
引数を与えるとその深さまで平坦化する

~~~Ruby
ary = [1, [2], [3, [4]]]

ary.flatten    #=> [1, 2, 3, 4]
ary.flatten(1) #=> [1, 2, 3, [4]]
~~~

###uniq -> Array
`self`から重複した要素を削除した配列を返す
ブロックを与えた場合、各要素を変数としてブロックを評価し、その戻り値が重複した要素を削除する

~~~Ruby
ary = %w[Alice alice Ben]

ary.uniq { |x| x.downcase } #=> ["Alice", "Ben"]
~~~


###transpose -> Array
`self`を行列と見立て、縦列と横列を入れ替える

~~~Ruby
ary = [
  [1,2],
  [3,4],
  [5,6]
]

ary.transpose #=> [[1, 3, 5], [2, 4, 6]]
~~~

###to_h -> Hash
`self`を`[key, value]`のぺアの配列として解析した結果を`Hash`にして返す
ブロックが与えられた場合、各要素を変数としてブロックを評価し、その戻り値を`[key, value]`のペアの配列として解析する

~~~Ruby
ary = [1, 2]

ary.to_h { |x| [x, x * 10] } #=> {1=>10, 2=>20}
~~~
`each_with_object`などでコーディングするよりもかなり文章量が減る

#最後に
るりまをよむのはいいぞ。（るりまおじさん）
表現力が上がり、メソッドの詳しい挙動が知れることもあり、良い事づくめです
紹介してないメソッドも沢山あるのでぜひ

#シリーズ
- 【Ruby】初心者がるりまを読んで初めて知ったメソッドをまとめてみる～Array～ <=ここ
- [【Ruby】初心者がるりまを読んで初めて知ったメソッドをまとめてみる～Hash～](https://qiita.com/porryanes/items/e6f900ea0ae46c0a41ef)