less than 1 minute read

iex> Enum.find([1, 2, 3], fn x -> rem(x, 2) == 0 end)
2
iex> Enum.find_value([1, 2, 3], fn x -> rem(x, 2) == 0 end)
true

두 함수 모두 두 번째 인자로 넘긴 함수가 참 같은 값(truthy value)을 리턴하는 원소(element)를 찾는다. elixir에서 참 같은 값(truthy value)는 nil, false가 아닌 모든 값이다.

Enum.find/3 함수는 원소를 리턴하는데 반해 Enum.find_value/3 함수는 원소를 찾는데 사용한 함수 리턴 값을 리턴한다. 그래서 첫번째 리턴 값은 2고 두번째 리턴 값은 true다.

[%{fruit: :orange, count: 1}, %{fruit: :banana, count: 2}]
|> Enum.find_value(fn
  %{fruit: :orange, count: c} -> c
  _ -> nil
end)

찾은 원소에서 다시 한번 더 값을 가져와야 할 때, 편하게 사용할 수 있다.

[%{fruit: :orange, count: 1}, %{fruit: :banana, count: 2}]
|> Enum.find(fn x -> x.fruit == :orange end)
|> case do
  %{count: c} -> c
  _ -> nil
end

Enum.find/3 함수를 사용하면 찾은 다음 원소에서 또 꺼내야 한다.