最近るりまを読んでいるので、学習したメソッドから有用そうなものをまとめていこうと思います
たのしいRubyを読み終わったあたりの初心者が対象の記事です
#Arrayクラス
###eql?(other) -> bool
self
とother
を比較する
普段使うなら==
で事足りるが、1
と1.0
を区別するといった場合に有用である
###fetch(nth) -> object
nth
の要素を返す
[]
と違うのは、要素がなかった場合の挙動である
- 第二引数を与えているとその値を返す
- ブロックを与えていると
nth
をブロック変数としてブロックを評価しその戻り値を返す - どちらもなければ例外発生
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]]
self
とlists
の各要素からなる配列の配列を生成して返す
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
などでコーディングするよりもかなり文章量が減る
#最後に
るりまをよむのはいいぞ。(るりまおじさん)
表現力が上がり、メソッドの詳しい挙動が知れることもあり、良い事づくめです
紹介してないメソッドも沢山あるのでぜひ
#シリーズ
- 【Ruby】初心者がるりまを読んで初めて知ったメソッドをまとめてみる~Array~ <=ここ
- 【Ruby】初心者がるりまを読んで初めて知ったメソッドをまとめてみる~Hash~