【发布时间】:2019-02-05 17:32:15
【问题描述】:
在许多情况下,我发现自己需要对结构本身及其字段进行模式匹配,并在某些中间结果不为空时继续执行一些进一步的操作。
但是,结构本身可能首先是nil。这导致我编写了多个嵌套匹配,例如
experiment = Repo.get(Experiment, experiment_id)
case experiment do
nil ->
# Error 1
_ ->
case experiment.active do
false -> # Error 2
true ->
case Repo.all(assoc(experiment, :experiment_results)) do
[] -> # Error 3
results -> # Do stuffs
end
end
理想情况下,我希望编写没有太多嵌套的代码。
如何重构代码?
(请注意,我最初的问题是关于结构上的模式匹配,而它可能是nil。我的实际用例比我最初提出的问题更广泛,因此我更新了这个问题。)
AlekseiMatiushkin 和 Sheharyar 的答案适用的原始代码:
experiment = Repo.get(Experiment, experiment_id)
case experiment do
nil ->
:error
_ ->
case experiment.active do
false -> :error
true -> # Do stuffs
end
end
【问题讨论】:
标签: functional-programming pattern-matching elixir phoenix-framework