アイテムがElixirリストまたはタプルに存在するかどうかを確認するにはどうすればよいですか?


83

これは一見単純そうに見えますが、ドキュメントで見つけることができないようです。単に返すtruefalse、アイテムがリストまたはタプルに存在するかどうかを確認する必要があります。でEnum.find/3、実際にこれを行うための最善の方法?

Enum.find(["foo", "bar"], &(&1 == "foo")) != nil

2
リストについては、Enum.member?/ 2が適切なアイテムがそこにあるかどうかを確認したい場所を確認できます。しかし、タプルの場合、通常は値の位置を気にします。これは、タプルの美しさの1つです...位置を気にしない場合は、タプルの使用法を検討することをお勧めします
CaptChrisD 2016

正しければ、@ Gazlerの回答を承認済みの回答としてマークすることをお勧めします。
Onorio Catenacci 2016

1
パフォーマンスに関する簡単なメモ。x in yそれはコンパイル時に異なる関数定義を作成するためのガードは非常にパフォーマンスです。実行時にはパフォーマンスが低下し、と同等Enum.member?ですが、小さいnに使用しても問題ありません。大きなnループとタイトなループの場合、MapSet.member?。などのハッシュを使用するとパフォーマンスが向上します。しかし、ほとんどの場合、x in yそしてEnum.member?大丈夫です!
デニス

回答:


125

使用できます Enum.member?/2

Enum.member?(["foo", "bar"], "foo")
# true

タプルを使用すると、最初にを使用してリストに変換する必要があります Tuple.to_list/1

Tuple.to_list({"foo", "bar"})
# ["foo", "bar"]

ガズラーに感謝します。あなたの答えは正しいですが、私はコミュニティの周りで受け取ったすべての提案に基づいて別の答えを投稿したいと思いました。
ewH 2016

Enum.member?/2ガード内では使用できませんのでご注意ください。その場合は、に依存する必要がありinます。例:def foo(string) when string in ["one", "two"], do: IO.puts(string)。ちなみに、これはおかしいです。なぜなら、これは:Dにin変換されるマクロだからEnum.member?/2です
Alessandro

39

ここと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がコメントで指摘しているように、パターンマッチングのためにタプル内のアイテムの正確な位置を通常気にするため、これはタプルのまれな必要性です。


26

または単に使用してくださいin

iex(1)> "foo" in ["foo", "bar"]
true
iex(2)> "foo" in Tuple.to_list({"foo", "bar"})
true

この答えは、OPの質問に答える唯一の答えのようなものです:「...エリクサーリストに存在します」...列挙型ではありません。
Daniel Lizik

2

昨日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]))

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.