[Ruby]配列を使用する際に便利なメソッドのあれこれ


発想の選択肢を広げる組み込みメソッド

業務でコードを書くようになり、Rubyの便利なメソッドが次々に出てくることに驚いている。

メソッドを覚えていないのでその都度毎回調べて適用できそうなものを使用していくことがしばらく続くと思われるのですが、覚えていないにしても選択肢としての自分の中の引き出しを作っておきたい。

引き出しがないと「〇〇したいから〇〇メソッドを使えばいいか、そのメソッドどうやって使うんだっけ」
という段階にすらいかないという危機感が生まれたので頻出そうなものをメモ程度に吐き出します。

きりがなさそうなので、とりあえず配列に関わりそうなものを。。

とりあげるメソッド

  • sample
  • values_at
  • assoc
  • compact
  • uniq
  • sort
  • transpose
  • zip
  • sum
  • flatten,flat_map
  • Array

要素取得系

sampleメソッド

配列からランダムに1つの要素を取り出す。
テストケースで配列の中からランダムに一つ実行させたいときとか使えそうな気がする

[1, 2, 3, 4, 5 ,6].sample
 #=> 5
[1, 2, 3, 4, 5 ,6].sample(3)
 #=> [4, 6, 3]

values_atメソッド

配列から不連続の複数の値を取り出せる。

ary = ['Apple', 'Orange', 'Strawberry', 'Banana']
a, b, c = ary[0], ary[1], ary[4]

こうしてたのを次のようにできる。

ary.values_at(0, 3, 4) #=> ["Apple", "Banana", nil]

assocメソッド

特定のキーを持つ要素を返す。アソシエーション。
ハッシュにしておけば簡単に指定して取り出せる。

ary = [[:Apple, 100], [:Orange, 50], [:Strawberry, 200]]
ary.assoc(:Orange) #=> [:Orange, 50]

配列の整形

compactメソッド

nilの要素を取り除いた配列を新しく生成。
どういうときに使うのかイマイチ例が浮かばないけど、
配列の中のnilいらん!ってなったらcompactを使うと覚えておくことにする。

[1, nil, 'abc', false].compact #=> [1, "abc", false]

uniqメソッド

重複をなくすメソッド。
色んな角度から条件を満たしていくものを配列にバンバン格納していき、最後にuniqをつけて重複を無くすといった使い方ができそう。便利。

[1, 1, 2, 2, 3, 4].uniq #=> [1, 2, 3, 4]

sortメソッド

順番を整えるメソッド

[5, 2, 6, 3, 1, 4].sort #=> [1, 2, 3, 4, 5, 6]
['a', 'd', 'b', 'c'].sort #=> ["a", "b", "c", "d"]

ハッシュ化

transposeメソッド

配列を行列に見立てて行と列の入れ替えを行う。
それぞれの配列番号がちゃんともう一方に対応したものであれば簡単にハッシュ化できる。

ary = [['Apple', 'Orange', 'Strawberry'],[100, 50, 200]]
ary.transpose #=> [["Apple", 100], ["Orange", 50], ["Strawberry", 200]]
ary.transpose.to_h #=> {"Apple"=>100, "Orange"=>50, "Strawberry"=>200}

zipメソッド

ハッシュ化でもとの配列が別々なら、zipしてしまえばいい。

product = ['Apple', 'Orange', 'Strawberry']
price = [100, 50, 200]
p product.zip(price) #=> [["Apple", 100], ["Orange", 50], ["Strawberry", 200]]
p product.zip(price).to_h #=> {"Apple"=>100, "Orange"=>50, "Strawberry"=>200}

その他便利そうなやつ

sum

数値だけでなく文字列もくっつけてくれる。
初期値を引数に与えることができる。

[1, 2, 3, 4].sum(5) #=> 15
['foo', 'bar'].sum('>>') #=> ">>foobar"
['foo', 'bar'].sum('') #=> "foobar"

配列の配列を連結することも可能とのこと。(この引数は初期値とは別かな??)
配列の平坦化。

[[1, 2], [3, 1, 5]].sum([]) #=> [1, 2, 3, 1, 5]

flattenメソッド

平坦化はこれが一般的。(可読性考えるとこっちのが楽)
入れ子になった配列を平坦にした新しい配列を返す。

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

flat_mapっていうmapの機能に平坦化をつけたメソッドもあるみたい。

ary = ['Dog is Animal', 'chicken is bird']
ary.map { |s| s.split(' ') } #=> [["Dog", "is", "Animal"], ["chicken", "is", "bird"]]

ary = ['Dog is Animal', 'chicken is bird']
ary.flat_map { |s| s.split(' ') } #=> ["Dog", "is", "Animal", "chicken", "is", "bird"]

Arrayメソッド

引数のオブジェクトがto_aryメソッドまたはto_aメソッドを持っていればその結果を、持っていなければオブジェクトを配列に入れて返す。

つまり

  • nilなら空の配列を返す
  • 配列は配列のまま返す
  • 数値や文字列であれば、それを要素とする配列を返す
Array(nil) #=> []
Array([1, 2, 3]) #=> [1, 2, 3]
Array(1) #=> [1]
Array('abc') #=> ["abc"]

引数に配列を渡したい!といったときにわざわざ条件分岐しなくてもArrayメソッドにつっこんでおけば、どんな形であろうと配列にしてくれるということか。便利。

まとめ

使い方やそのメソッドの挙動を確認することはよくしていたが、実際にそのメソッドがどんな場面に使われるかを想像することは今まであまりしてこなかった。
経験が足りないため、使用例がイメージできないことのほうが多いが、今後も実際に使うことをイメージしながら学習を進めていきたい。