gpt4 book ai didi

Elixir - 在特定情况下不执行任何操作

转载 作者:行者123 更新时间:2023-12-02 05:01:46 24 4
gpt4 key购买 nike

在 Elixir 的 case 语句中,如果 case 语句中满足特定条件,是否可以不执行任何操作?或者必须始终返回某些东西?

为了说明这一点,这里是我正在开发的 Phoenix 应用程序的一个片段:

Enum.map(record_params, fn(record_id) ->
record = Repo.get!(Record, record_id)
case Repo.update(record) do
{:ok, struct} ->
# I DON'T REALLY NEED ANYTHING TO HAPPEN HERE... BUT I HAVE TO HAVE A CLAUSE TO MATCH WHEN THE UPDATE RETURNS {:ok, struct}
IO.inspect struct
{:error, changeset} ->
errors = parse_errors(changeset)
IO.inspect errors
json(conn |> put_status(400), %{status: "error", message: "There was a problem updating this record.", errors: errors})
end
end)

如果记录被更新,我需要知道是否有错误,获取相关信息,并将其返回给客户端,因此需要case声明...但如果记录已成功更新,我实际上不需要执行任何操作 - {:ok, struct}。由于这些更新发生在 Enum.map() 内,如果更新成功,我只希望 map 继续循环 record_ids

目前,我刚刚将 IO.inspect struct 置于成功条件中 - 这是无害的,但并不是真正必要的。如果可能的话,我更愿意清理我的代码。由于 Elixir 的模式匹配,我无法删除 {:ok, struct} 条件,如果我在该条件下什么都不放,我会收到错误 syntax error before: '->'

现在我对 Elixir(以及一般的函数式编程范例)完全陌生,所以如果有一种更“Elixirish”的方法来处理这种情况,我很想听听。

最佳答案

尽管已经有很多答案,但我还是会发布另一个答案。 忽略除一个返回之外的所有返回的惯用 Elixir 方法是使用 Kernel.SpecialForms.with/1 :

with {:error, changeset} <- Repo.update(record) do
# Do whatever you want here
end

当且仅当匹配发生时才会执行do block ,否则不匹配的RHO值({:ok, _}将直接返回。)

有关执行您想要的操作的正确代码,请参阅@Dogbert 的答案。

关于Elixir - 在特定情况下不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43647101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com