Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 对于特定情况,案例不返回任何内容_Elixir - Fatal编程技术网

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)