目次
filter(select)について
filterは条件を満たす全ての要素を取り出すメソッドです。select
はfilter
のエイリアス(等価のメソッド)です。filter
の例は以下の通りです。
> [1, 2, 3, 4, 5, 6].filter {|i| i % 3 == 0 }
=> [3, 6]
参考: rejectを利用するとselectの逆の結果が得られる
rejectはブロックの評価が偽の要素を集めた配列を返すため、select
の逆の結果が得られます。
> [1, 2, 3, 4, 5, 6].reject {|i| i % 3 == 0 }
=> [1, 2, 4, 5]
find(detect)について
findは条件を満たした最初の要素を返すメソッドです。detect
はfind
のエイリアス(等価のメソッド)です。find
の例は以下の通りです。find
の例は以下の通りです。
> [1, 2, 3, 4, 5, 6].find {|i| i % 3 == 0 }
=> 3
filterとfindの使いわけ
filter
は条件を満たす要素全てを返します。ですのでfilterは条件を満たす要素が複数存在するケースで利用します。
以下はfilter
を利用してis_active
がtrue
なUserを取得する例です。
users = []
3.times do |i|
users << User.new(id: "#{i + 1}", name: "user_#{i + 1}", is_active: "#{i.even?}")
end
> users.filter { |user| user.is_active? }
=> [#<User:0x0000562b91e44518 id: 1, name: "user_1", is_active: true, created_at: nil, updated_at: nil>,
#<User:0x0000562b91e27530 id: 3, name: "user_3", is_active: true, created_at: nil, updated_at: nil>]
一方、find
は条件を満たした要素のうち最初の1要素のみを返します。ですのでfindは主キーのように要素が一意に定まる条件で検索をするケースで利用します。
以下はfind
を利用してid
が1のUserを取得する例です。
users = []
3.times do |i|
users << User.new(id: "#{i + 1}", name: "user_#{i + 1}", is_active: "#{i.even?}")
end
> users.find { |user| user.id == 1 }
=> #<User:0x0000562b91e44518 id: 1, name: "user_1", is_active: true, created_at: nil, updated_at: nil>
さいごに
Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!