例如,在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
答案 0 :(得分:2)
这意味着两次否定该语句(Kernel.!/1
)。在Credo
's documentation中找到了关于执行此操作的最佳说明:
您的代码中有两个否定符会掩盖原始参数 值。
# NOT preferred !!var
这将为
false
和false
返回nil
,为true
返回true
还要别的吗。起初,这似乎是一个额外的聪明速记 给false
投真相,给nil
投不真实。 但是在大多数情况下,您都希望明确输入 参数(因为边缘情况的推理比较容易, 代码路径和测试)。另外:
false
和null
的意思是两件事。但是,您需要这种灵活性的情况是 解析外部数据,例如第三方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')
检查仅查找布尔值。