【问题标题】:Wrong return value pattern错误的返回值模式
【发布时间】:2020-05-10 12:21:33
【问题描述】:

社区!

我是 Elixir 的新手,遇到了一个问题。 我正在 Phoenix 上制作 API 并坚持一种模式:

  • {:ok, some_data} 成功
  • {:error, some_data} 出错。

我的控制器请求了域:

with {:ok, some_data} <- Organisation.create(...) do

end

域反过来请求某些服务:

with {:ok, service_data} when length(service_data) == 0 <- SomeService.get(...) do
    {:ok, [1, 2, 3]} # Some other LIST data
end

所以,如果when length(service_data) == 0 变成True,那么服务将返回 {:ok, [1, 2, 3]},但如果是False,那么服务将返回{:ok, service_data} - 这是不可接受的!

在这种情况下我该怎么办?是否有任何最佳做法。

附:不能使用case 过滤返回,因为两个返回都是{:ok, []}

【问题讨论】:

  • length(service_data) &gt; 0时你希望函数返回什么?
  • 问题是当列表为空时它会返回{:ok, [1, 2, 3]}。你想对非空列表也一样吗?
  • 您能否将每个案例的预期输入/输出添加到问题中?
  • 如果length(service_data) = 0 将返回{:ok, [1, 2, 3]} 如果length(service_data) &gt; 0 将返回一些错误,我认为,或者这是不可能的?
  • 我想使用with do end 构造,因为“创建”逻辑由几个动作组成。

标签: elixir phoenix-framework


【解决方案1】:

附:使用大小写过滤返回不是一种选择,因为两个返回都是 {:ok, []}。

不确定您的意思,但这确实适合带有列表模式的case

case SomeService.get(...) do
  {:ok, []} -> {:ok, [1, 2, 3]}
  {:ok, _} -> {:error, "not an empty list"}
  error -> error
end

第一个子句匹配空列表,因此第二个子句将匹配非空列表。如果都不匹配,我们返回我们得到的值。

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2019-12-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多