ようへいの日々精進XP

よかろうもん

Ruby の find と select

うっかり混同しそうになっていたので

忘れないうちにメモっておきたいと思います。

参考

有難うございます。

Enumerable モジュール

上記サイトを言葉を引用させて頂くと、

Enumerableモジュールは、配列やハッシュなど集合を表すクラスに数え上げや検索などのメソッドを提供します。

find や select は Enumerable モジュールにより提供されているとのことです。

メモ

環境

ubuntu@ubuntu-xenial:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"

ubuntu@ubuntu-xenial:~$ ruby --version
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

select

以下のように 2 で割り切れる要素全てを配列で返す。つまり、{ } ブロックが true となる要素全てを配列で返すのが select ということでしょうか。

irb(main):001:0> [1, 2, 3, 4, 5, 6].select { |n| n % 2 == 0 }
=> [2, 4, 6]

ちなみに select と同じ機能を提供するが find_all で、以下のように同じ結果が得られます。

irb(main):003:0> [1, 2, 3, 4, 5, 6].find_all { |n| n % 2 == 0 }
=> [2, 4, 6]

find

以下のように 2 で割り切れる要素の最初の要素を返す。select に対して { } ブロックが true となる最初の要素を返すのが find ということでしょうか。

irb(main):002:0> [1, 2, 3, 4, 5, 6].find { |n| n % 2 == 0 }
=> 2

find と同じ機能を提供するのが detect で、以下のように同じ結果が得られます。

irb(main):004:0> [1, 2, 3, 4, 5, 6].detect { |n| n % 2 == 0 }
=> 2

以上

select は

  • ブロックが true となる要素全部を配列で返します
  • find_all という別名があります

find

  • ブロックが true となる最初の要素を返します
  • detect という別名があります