你能模式匹配elixir中的非空数组吗?

Ter*_*how 9 elixir

我有一个User与之有has_many关系的模特other_model.我有一个Search搜索互联网的功能.我想做的是只在has_many关系不是空数组的情况下搜索互联网.

所以我想知道我是否可以针对非空数组进行模式匹配?正如您在下面看到的,Search嵌套分支中的额外结果因此我使用该with语句并希望获得一个干净的解决方案.

query = from a in Model, where: a.id == ^id, preload: [:some_associations]

with %{some_associations: some_associations} <- Repo.one(query),
      {:ok, some_results} <- Search.call(keywords, 1) do
            do_something_with(some_associations, some_results)
else
    nil -> IO.puts "query found nothing"
    {:error, reason} -> IO.puts "Search or query returned error with reason #{reason}"
end
Run Code Online (Sandbox Code Playgroud)

Dog*_*ert 15

您可以使用该模式[_ | _]匹配非空列表:

{:ok, some_results = [_ | _]} <- Search.call(keywords, 1)
Run Code Online (Sandbox Code Playgroud)
iex(1)> with xs = [_|_] <- [1, 2, 3] do {:ok, xs} else _ -> :error end
{:ok, [1, 2, 3]}
iex(2)> with xs = [_|_] <- [] do {:ok, xs} else _ -> :error end
:error
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法模式匹配包含特定类型结构的非空列表?像`[%User{}, %User{}, %User{}, %User{} ...]` ? (2认同)