Elixir 对于特定情况,案例不返回任何内容
有此代码:Elixir 对于特定情况,案例不返回任何内容,elixir,Elixir,有此代码: defmodule TestQuery do def build_query() do Enum.map(["test1", "test2", "hello"], fn item -> query(item) end) end def query(item) do case String.contains? item, "test" do true -> item false -> nil
defmodule TestQuery do
def build_query() do
Enum.map(["test1", "test2", "hello"], fn item ->
query(item)
end)
end
def query(item) do
case String.contains? item, "test" do
true -> item
false -> nil
end
end
end
如果我运行它,我将以以下列表结束:
iex(2)> TestQuery.build_query()
["test1", "test2", nil]
如何避免添加nil
?或者对false
子句不执行任何操作
这个例子是一个简单的查询方法的例子,这个查询可能会返回一个
nil
(404),我想用成功的查询建立一个列表,没有nil
项。我可以想到三种方法:
Enum.filter/2
并从query
返回true
/false
:
def build_query() do
Enum.filter(["test1", "test2", "hello"], fn item ->
query(item)
end)
end
def query(item) do
String.contains? item, "test"
end
如果实际的查询
函数想要返回一个不是项
的值,那么这将不起作用nil
值:
Enum.map(["test1", "test2", "hello"], fn item ->
query(item)
end) |> Enum.reject(&is_nil/1)
如果item
为nil
,则此项不起作用,因为它也将被删除Enum.flat_map
并返回一个空列表,而不是nil
,如果不是nil,则返回一个非空列表:
def build_query() do
Enum.flat_map(["test1", "test2", "hello"], fn item ->
query(item)
end)
end
def query(item) do
case String.contains? item, "test" do
true -> [item]
false -> []
end
end
Enum.filter/2
仅返回第二个参数返回真实值的元素。在长生不老药中,一切都是真实的,除了零和虚假。因此,您可以这样使用查询函数(无需添加匿名函数):
或者对于那个特定的例子:
Enum.filter(["test1", "test2", "hello"], &String.contains?(&1, "test"))
或者,您甚至可以使用理解并将成功的查询映射到另一个列表:
for item <- ["test1", "test2", "hello"], String.contains?(item, "test"),
do: on_successful(item)
项目的
for item <- ["test1", "test2", "hello"], String.contains?(item, "test"),
do: on_successful(item)