はじめに
もうすぐ入社1年になるエンジニアです。
最近、開発チームの勉強会で「良いコード悪いコード」という本を読みました。その本の、コレクション(※)に関する説明で、車輪の再発明をせずに標準ライブラリに用意されているメソッドを使おうと書かれていて、確かにあるものは使うべきだなと思いました。
そこで、配列とハッシュのメソッドを調べてみたので、知らなかったけど使う機会がありそうなメソッドや知らない人は車輪の再発明してしまいそうなメソッドを6つ紹介しようと思います。
※ コレクション:複数のデータをまとめて格納するためのデータ構造。rubyでは、配列やハッシュなどがある。
配列・ハッシュ共通のメソッド
select
メソッド
selectメソッドは、配列の各要素に対して条件式を満たす要素のみで構成される新しい配列を返します。ハッシュの場合も同様です(例を参照)。
# 基本構文
配列.select { |変数| 条件式 }
ハッシュ.select { |変数1, 変数2| 条件式 }
# 配列の例
array = [1, 2, 3, 4, 5]
new_array = array.select { |elem| elem < 3 }
pp new_array # => [1, 2]
# ハッシュの例
hash = { a: 1, b: 2, c: 3 }
new_hash = hash.select { |key, value| value >= 2 }
pp new_hash # => { b: 2, c: 3 }
reject
メソッド
rejectメソッドは、selectメソッドとは逆に、配列の各要素に対して条件式を満たさない要素のみで構成される新しい配列を返します。ハッシュの場合も同様です(例を参照)。
# 基本構文
配列.reject { |変数| 条件式 }
ハッシュ.reject { |変数1, 変数2| 条件式 }
# 配列の例
array = [1, 2, 3, 4, 5]
new_array = array.reject { |elem| elem >= 2 && elem <= 4 }
pp new_array # => [1, 5]
# ハッシュの例
hash = { a: 1, b: 2, c: 3 }
new_hash = hash.reject { |key, value| value == 2 }
pp new_hash # => { a: 1, c: 3 }
find
メソッド
findメソッドは、ブロック内で指定した条件式を満たす最初の要素を取得します。ただし、条件式を満たす要素が存在しない場合は、nilを返します。
自分は、コードレビューの時に~.select { ~ }[0]
という処理を見たのですが、その時はまだfindメソッドを知らなかったのでスルーしてしまった記憶があります。
# 基本構文
配列.find { |変数| 条件式 }
ハッシュ.find { |変数1, 変数2| 条件式 }
# 配列の例
array = [1, 2, 3, 4]
elem = array.find { |elem| elem % 2 == 0 }
pp elem # => 2
# ハッシュの例
hash = { a: 1, b: 2, c: 3 }
elem = hash.find { |key, value| value % 2 == 0 }
pp elem # => [:b, 2] ハッシュの場合は、キーとバリューの配列を返すので注意
pp elem.to_h # => { b: 2 }
配列のメソッド
grep
メソッド
grepメソッドは、引数に正規表現を指定してパターンにマッチした要素を配列として返します。
# 基本構文
配列.grep(/正規表現/)
array = ['aaa', 'aab', 'abb', 'bbb']
new_array = array.grep(/^a.b$/) # aで始まるbで終わるパターンのみ取得
pp new_array # => ['aab', 'abb']
ハッシュのメソッド
key?
メソッド
ハッシュが引数で指定した値をキーとして持つ場合はtrue、持たないはfalseを返します。
同様のメソッドにvalue?
メソッドもあります。
全く同じ挙動ではありませんがkey?
メソッド知らないと、hash[:key] != nil
のように書いてしまいそうですね。
# 例
hash = { a: 1, b: 2, c: 3 }
pp hash.key?(:a) # => true
pp hash.key?(:z) # => false
transform_values
メソッド
全てのバリューに対してブロック内の処理を実行した結果で置き換えたハッシュを返します。キーは変化しません。
このメソッドを知らないで、hash.map { |key, value| keyを使わない処理 }
のように書いてしまいそうですね。
同様のメソッドに、transform_keys
メソッドもあります。
# 基本構文
ハッシュ.transform_values { |変数| 実行する処理 }
# 例
hash = { a: 1, b: 2, c: 3 }
new_hash = hash.transform_values { |value| value * 2 }
pp new_hash # => { a: 2, b: 4, c: 6 }
おわりに
配列やハッシュのメソッドを6つ紹介しましたが、知らないメソッドはあったでしょうか?
使えそうだなと思ったメソッドがあれば、頭の片隅にでもいれておくと、実装を考える際に役立つことがあると思います。
参考記事