如何使用过多的嵌套来重构case语句

xji*_*xji 0 functional-programming elixir pattern-matching phoenix-framework

在许多情况下,我发现自己需要在结构本身及其字段上进行模式匹配,并在某些中间结果不为空时继续执行一些进一步的操作.

但是,结构本身可能是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
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想编写没有那么多嵌套的代码.

我该如何重构代码?


(请注意,我原来的问题是关于结构上的模式匹配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
Run Code Online (Sandbox Code Playgroud)

Ale*_*kin 5

我会选择直接模式匹配.

Experiment
|> Repo.get(experiment_id)
|> case do
  %Experiment{active: true, other_attribute: :value} ->
    # do stuff
  _ ->
    :error
end
Run Code Online (Sandbox Code Playgroud)