これは一見単純そうに見えますが、ドキュメントで見つけることができないようです。単に返す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?
ですが、小さい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)
。ちなみに、これはおかしいです。なぜなら、これは:Dにin
変換されるマクロだからEnum.member?/2
です
こことElixirSlackの回答に基づいて、アイテムがリストに存在するかどうかを確認する方法は複数あります。@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"
タプルをチェックしたい場合は、リストに変換する必要があります(クレジット@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
昨日Elixirでプログラミングを始めましたが、JSでたくさんやったことを試してみます。リストに多くの要素があり、Enum.memberを使用して常にトラバースしたくない場合に役立つかもしれません。
map_existence = Enum.reduce(list,%{}, &(Map.put(&2,&1,true)))
map_existence[item_to_check]
他のリストとの交差を取得することもできます。
Enum.filter(some_other_list,&(map_existence[&1]))
あなたも使うことができます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