为什么 if 语句中的模式匹配不受欢迎?

Ell*_*son 5 elixir phoenix-framework

我刚刚在我的 Phoenix 应用程序中安装了Credo mix 库,它告诉我该web/views/error_helpers.ex文件在错误标记方法中有重构机会:

def error_tag(form, field) do
  if error = form.errors[field] do
    content_tag :span, translate_error(error), class: "help-block"
  end
end
Run Code Online (Sandbox Code Playgroud)

信条给出的信息是:

条件中不应存在匹配项if

换句话说,if error = form.errors[field] do里面有一个模式匹配。但是,除了该消息之外,Credo 库没有详细说明。

为什么这样不好?

Sas*_*eca 2

就像其他海报所说的那样,它不太惯用,可能会导致一些分析问题(或常见错误,例如键入=而不是==)。我对此的主要论据是以下情况:

if get_status = :ok do 
  # Some code
else
  # Some other code
Run Code Online (Sandbox Code Playgroud)

这是非常有限的并且不是很有表现力,cond do您可以执行以下操作:

cond get_status do
  :ok -> # Some code
  :not_ok -> # Some other code
  _ -> # More code
end
Run Code Online (Sandbox Code Playgroud)

如果条件几乎是二元的,那么你要么得到 A,要么得到其他东西。如果结果是来自本地函数调用或类似的布尔值,那么这很好,但如果您正在使用分布式系统,从另一台机器或类似的机器获取信息会cond do更强大、更简洁,并且可以帮助您推理和设置代码意外行为(上面代码中的下划线,如果get_status是一个获取某个服务状态的函数,我们期望类似 :ok 表示服务已准备好,而 :not_ok 如果服务未准备好,那么如果服务已准备好怎么办?机器宕机了?或者我们的网线是否断开了?)。

当然,这可以通过多个if语句来实现,但这会导致代码质量较差,可读性或可维护性不高。