이것은 겉보기에 간단 해 보이지만 문서에서 찾을 수없는 것 같습니다. 단순히 반환 true
하거나 false
항목이 목록 또는 튜플에있는 경우 필요합니다 . 이 Enum.find/3
작업을 수행하는 가장 좋은 방법입니까?
Enum.find(["foo", "bar"], &(&1 == "foo")) != nil
이것은 겉보기에 간단 해 보이지만 문서에서 찾을 수없는 것 같습니다. 단순히 반환 true
하거나 false
항목이 목록 또는 튜플에있는 경우 필요합니다 . 이 Enum.find/3
작업을 수행하는 가장 좋은 방법입니까?
Enum.find(["foo", "bar"], &(&1 == "foo")) != nil
x in y
은 컴파일 타임에 다른 기능 정의를 생성하기 때문에 경비가 매우 확대됨에있다. 런타임시에는 성능이 떨어지며,과 동일 Enum.member?
하지만 small n 에는 사용하는 것이 좋습니다 . 큰 n 및 타이트 루프의 경우 MapSet.member?
. 그러나 대부분의 경우에, x in y
그리고 Enum.member?
정상입니다!
답변:
당신이 사용할 수있는 Enum.member?/2
Enum.member?(["foo", "bar"], "foo")
# true
튜플을 사용하면 먼저 다음을 사용하여 목록으로 변환하고 싶을 것입니다. Tuple.to_list/1
Tuple.to_list({"foo", "bar"})
# ["foo", "bar"]
Enum.member?/2
가드 내부에서는 사용할 수 없습니다 . 이 경우 in
. 예 : def foo(string) when string in ["one", "two"], do: IO.puts(string)
. 그건 그렇고, 이것은 재밌습니다. 왜냐하면 다음 in
과 같이 번역되는 매크로 이기 때문 입니다 Enum.member?/2
. D
여기와 Elixir Slack의 답변을 기반으로 목록에 항목이 있는지 확인하는 여러 방법이 있습니다. @Gazler의 답변 :
Enum.member?(["foo", "bar"], "foo")
# true
또는 단순히
"foo" in ["foo", "bar"]
# true
또는
Enum.any?(["foo", "bar"], &(&1 == "foo")
# true
또는 당신이 찾아 대신 항목을 반환하려는 경우 true
또는false
Enum.find(["foo", "bar"], &(&1 == "foo")
# "foo"
튜플을 확인하려면 목록으로 변환해야합니다 (credit @Gazler).
Tuple.to_list({"foo", "bar"})
# ["foo", "bar"]
그러나 @CaptChrisD가 주석에서 지적했듯이 이것은 일반적으로 패턴 일치를 위해 튜플에서 항목의 정확한 위치에 관심이 있기 때문에 튜플에 대한 드문 필요입니다.
또는 다음을 사용하십시오 in
.
iex(1)> "foo" in ["foo", "bar"]
true
iex(2)> "foo" in Tuple.to_list({"foo", "bar"})
true
다음을 사용할 수도 Enum.find_value/3
있습니다.
iex(1)> Enum.find_value(["foo", "bar"],false, fn(x)-> x=="foo" end)
true
iex(2)> Enum.find_value(["foo", "bar"],false, fn(x)-> x=="food" end)
false