#TIL #elixirlang 찾은 원소에 한번 더 접근해야 한다면 Enum.find_value
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
함수를 사용하면 찾은 다음 원소에서 또 꺼내야 한다.