バージョン情報
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin18]
やりたいこと
Array#find_index は引数に一致する最初の要素のインデックスを返す。
%w(🦜 🐟 🐁 🦄 🐁).find_index('🐁') #=> 2
でも一致するすべてのインデックスを返してほしいな。
%w(🦜 🐟 🐁 🦄 🐁).some_method('🐁') #=> [2, 4]
方法
module ArrayExtension
refine Array do
def find_indexes(val)
filter_map.with_index { |element, i| i if element == val }
# Ruby 2.7 未満の場合は Enumerable#filter_map がないので他の書き方で。
# map.with_index { |element, i| i if element == val }.compact
end
end
end
using(ArrayExtension) # irb --context-mode=1 で起動すると irb でも using が使えるぞ。
%w(🦜 🐟 🐁 🦄 🐁).find_indexes('🐁') #=> [2, 4]
%w(🦜 🐟 🐁 🦄 🐁).find_indexes('🐟') #=> [1]
%w(🦜 🐟 🐁 🦄 🐁).find_indexes('🐝') #=> []