我在庫中找不到確切的函數,所以試圖實現它。希望它可以幫助一些。
defmodule Sample1 do
# combining Enum functions
def find_indexes(collection, function) do
Enum.filter_map(Enum.with_index(collection), fn({x, _y}) -> function.(x) end, elem(&1, 1))
end
end
defmodule Sample2 do
# implementing as similar way as Enum.find_index
def find_indexes(collection, function) do
do_find_indexes(collection, function, 0, [])
end
def do_find_indexes([], _function, _counter, acc) do
Enum.reverse(acc)
end
def do_find_indexes([h|t], function, counter, acc) do
if function.(h) do
do_find_indexes(t, function, counter + 1, [counter|acc])
else
do_find_indexes(t, function, counter + 1, acc)
end
end
end
IO.puts "Sample1"
IO.inspect Sample1.find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "a" end)
IO.inspect Sample1.find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "c" end)
IO.inspect Sample1.find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "b" end)
IO.puts "Sample2"
IO.inspect Sample2.find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "a" end)
IO.inspect Sample2.find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "c" end)
IO.inspect Sample2.find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "b" end)
如下執行,
% elixir find.ex
Sample1
[0]
[2]
[1, 3, 4]
Sample2
[0]
[2]
[1, 3, 4]
謝謝你的幫助@parroty!我們也可以這樣做:'Enum.with_index([「a」,「b」,「c」,「b」,「b」])> Enum.filter_map(fn {x,_} - > x = =「b」end,fn {_,i} - > i end)' – Doug
是的。這會更像長生不老藥。 – parroty