これは一見シンプルですが、ドキュメントで見つけることができないようです。リストまたはタプルにアイテムが存在する場合は、単にtrue
またはfalse
を返す必要があります。 Enum.find/3
は本当にこれを行う最良の方法ですか?
Enum.find(["foo", "bar"], &(&1 == "foo")) != nil
Enum.member?/2
を使用できます
Enum.member?(["foo", "bar"], "foo")
# true
タプルでは、最初に Tuple.to_list/1
を使用してリストに変換する必要があります。
Tuple.to_list({"foo", "bar"})
# ["foo", "bar"]
ここと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"
タプルを確認する場合は、リストに変換する必要があります(クレジット@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