LoginSignup
1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-02

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

Arrayクラス

eql?(other) -> bool

selfotherを比較する

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

fetch(nth) -> object

nthの要素を返す

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

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

dig(idx, ...) -> object | nil

ネストしたオブジェクトを参照して返す

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

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

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

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

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は整数か整数の範囲オブジェクトで指定する

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と等しい最初の配列を返す

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

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

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

[1]を検索する rassoc もある

rindex(val) -> Integer | nil

valと等しい最後の要素を返す

index に対応するメソッドである

ary = %w[a b a]

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

bsearch { |x| ... } -> object | nil

二分探索をする

有用そう(希望的観測)

delete_at(pos) -> object | nil

インデックスでdeleteする

ary = %w[a b c]

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

delete_if {|x| ... } -> self

ブロックの評価が真(nil, false以外)になった要素を削除する

reject! と違い、変化がなくてもselfを返すので中々便利

ary = [4, 2, 6]

ary.reject! { |x| x.odd? }.sort #=> undefined method `sort' for nil:NilClass (NoMethodError)
ary = [4, 2, 6]

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

ブロックの評価が偽になった要素を削除する keep_if もある

drop(n) -> Array

先頭からn個の要素を削除して残った配列を返す
削除した要素を返す shift と違い、残った要素を返すので使い分けができるだろう

ブロックで判定を行う drop_while もある

dup -> Array

selfのコピーの配列を返す

レシーバと戻り値は別のオブジェクトだが、要素は同じオブジェクトを参照している
完全なコピーを作るには Marshalモジュール を使うのがよいだろう

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

sample -> object | nil

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

reverse_each {|item| ... } -> self

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

zip(*lists) -> [[object]]

selflistsの各要素からなる配列の配列を生成して返す

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

ary1.zip(ary2) #=> [[1, 4], [2, 5], [3, 6]]

ブロックを与えるとzipした結果の配列でイテレートする

rotate(cnt = 1) -> Array

cntの位置の要素を先頭として要素を回転させた配列を返す

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を平坦化した配列を返す
引数を与えるとその深さまで平坦化する

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

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

uniq -> Array

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

ary = %w[Alice alice Ben]

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

transpose -> Array

selfを行列と見立て、縦列と横列を入れ替える

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

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

to_h -> Hash

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

ary = [1, 2]

ary.to_h { |x| [x, x * 10] } #=> {1=>10, 2=>20}

each_with_objectなどでコーディングするよりもかなり文章量が減る

最後に

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

シリーズ

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0