1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?