elixir:高级`cond`操作 - 最佳实践?

时间:2018-01-30 05:01:40

标签: elixir

我有一个复杂的UILabel用例我很好奇,如果这是最好的方法。

以下代码主要尝试将客户与现有记录进行匹配。

我需要代码在查询排列返回任何行后停止检查。

sudo chmod 775 -R storage/logs

还有更多的问题,我已经略微调整了一下。不要专注于业务逻辑,我只想清理这种情况。

1 个答案:

答案 0 :(得分:1)

我们可以利用函数在同一模块中的事实,并修复前三个参数以使用Enum.reduce_while/3简化此操作:

[
  {:findExactNameAndDob, [dob]},
  {:findExactNameAndMobile, [phone]},
  {:findExactNameAndEmail, [email]},
  {:findExactNameAndLocation, [address, postcode]}
]
|> Enum.reduce_while(nil, fn {func, args}, nil ->
  case apply(CustomerRepo, func, [store_id, firstname, lastname] ++ args) do
    [] -> {:cont, nil}
    customers -> {:halt, customers}
  end
end)

这应该使代码更简单,因为你说你在实际代码中有更多这样的子句。

编辑:使用Enum.find_value/2假设成功值不是零或假(这里它总是一个列表,所以它很好),这是一种更简单的方法:

[
  {:findExactNameAndDob, [dob]},
  {:findExactNameAndMobile, [phone]},
  {:findExactNameAndEmail, [email]},
  {:findExactNameAndLocation, [address, postcode]}
]
|> Enum.find_value(fn {func, args} ->
  case apply(CustomerRepo, func, [store_id, firstname, lastname] ++ args) do
    [] -> false
    customers -> customers
  end
end)