为什么在解析选项映射输入时使用双感叹号(!!)?

时间:2019-01-08 16:13:16

标签: elixir

例如,在ExUnit.Case.__using__/1宏中:

defmacro __using__(opts) do
  # ...
  quote do
    async = !!unquote(opts)[:async]
    # ...
  end
  # ...
end

:async use时,ExUnit.Case是布尔选项。

defmodule AssertionTest do
  use ExUnit.Case, async: true

  test "always pass" do
    assert true
  end
end

1 个答案:

答案 0 :(得分:2)

这意味着两次否定该语句(Kernel.!/1)。在Credo's documentation中找到了关于执行此操作的最佳说明:

  

您的代码中有两个否定符会掩盖原始参数   值。

  # NOT preferred
  !!var
     

这将为falsefalse返回nil,为true返回true   还要别的吗。起初,这似乎是一个额外的聪明速记   给false投真相,给nil投不真实。   但是在大多数情况下,您都希望明确输入   参数(因为边缘情况的推理比较容易,   代码路径和测试)。

     

另外:falsenull的意思是两件事。

     

但是,您需要这种灵活性的情况是   解析外部数据,例如第三方JSON-API,其中值为   有时false和有时 # preferred defp present?(nil), do: false defp present?(false), do: false defp present?(_), do: true ,而您想规范化   在将它传递到您的程序之前。在这种情况下,您   最好通过引入助手来使演员表明确   功能:

!!
     

这使您的代码比依赖含义更明确   的:async

在问题的示例中,这是必需的,因为如果不存在nil选项,则获取该键将导致false,但是稍后需要将其转换为pd.merge(df1, df2, how = 'outer', on = 'Time') 检查仅查找布尔值。