如何检查一个项目是否存在于一个Elixir列表或元组中?

这看起来很简单,但我似乎无法在文档中find它。 如果一个项目存在于列表或元组中,我只需要返回truefalseEnum.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 

或者如果你想find并返回的项目,而不是truefalse

 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 

你也可以使用find_value

 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 

我昨天开始在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]))