【问题标题】:Can you pattern match a non empty array in elixir?你可以在长生不老药中模式匹配一​​个非空数组吗?
【发布时间】:2017-03-07 14:06:40
【问题描述】:

我有一个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

【问题讨论】:

  • 你的意思是像{:ok, some_results = [_ | _]} &lt;- ...
  • 我需要 some_associatuons 不为空。嗯,我回家后会试试的。没想到你能做到……
  • @Dogbert 您需要发布其中一些作为答案 :) 人们会在 cmets 中想念他们。 :)

标签: elixir


【解决方案1】:

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

{:ok, some_results = [_ | _]} <- Search.call(keywords, 1)
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

【讨论】:

  • 有没有办法对包含特定类型结构的非空列表进行模式匹配?喜欢[%User{}, %User{}, %User{}, %User{} ...]
  • 是的。 [%User{} | _].
猜你喜欢
  • 1970-01-01
  • 2014-03-16
  • 2018-11-24
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
相关资源
最近更新 更多