案件在特定条件下没有返回

时间:2018-01-29 16:41:41

标签: elixir

拥有此代码:

iex(2)> TestQuery.build_query()
["test1", "test2", nil]

如果我运行它,我将以此列表结束:

nil

如何避免添加false?或者对nil条款什么都不做?

此示例是一个简单的示例,该方法使查询和查询可能返回nil(404),我想构建一个包含成功查询的列表,而不包含Either项。

2 个答案:

答案 0 :(得分:4)

我能想到的三种方式:

  1. 使用Enum.filter/2并从true返回false / query

    def build_query() do
      Enum.filter(["test1", "test2", "hello"], fn item ->
        query(item)
      end)
    end
    
    def query(item) do
      String.contains? item, "test"
    end
    

    如果您的实际query函数想要返回的值不是item,则无效。

  2. 删除结尾处的所有nil值:

    Enum.map(["test1", "test2", "hello"], fn item ->
      query(item)
    end) |> Enum.reject(&is_nil/1)
    

    如果itemnil,这将无法使用,因为它也会被移除。

  3. 使用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
    

答案 1 :(得分:2)

Enum.filter/2仅返回第二个arg返回truthy值的元素。在Elixir,除了nil和false之外,一切都是真实的。所以,你可以用这种方式使用你的查询函数(不需要添加匿名函数):

Enum.filter(["test1", "test2", "hello"], &query/1)

或者对于那个特定的例子:

Enum.filter(["test1", "test2", "hello"], &String.contains?(&1, "test"))

或者你甚至可以使用理解并将成功的查询映射到另一个列表中:

for item <- ["test1", "test2", "hello"], String.contains?(item, "test"),
  do: on_successful(item)