Elixir 为什么在解析选项映射输入时使用双感叹号(!!)?
例如,在宏中: 其中Elixir 为什么在解析选项映射输入时使用双感叹号(!!)?,elixir,Elixir,例如,在宏中: 其中:async是使用ingExUnit.Case时的一个布尔选项 defmodule AssertionTest do use ExUnit.Case, async: true test "always pass" do assert true end end 它意味着两次否定该语句()。找到有关为什么在中执行此操作的最佳说明: 在代码中使用双重否定会模糊原始参数 价值观 对于false和nil,这将返回false,对于true 别的。起初,这似乎是一个
:async
是使用ingExUnit.Case
时的一个布尔选项
defmodule AssertionTest do
use ExUnit.Case, async: true
test "always pass" do
assert true
end
end
它意味着两次否定该语句()。找到有关为什么在中执行此操作的最佳说明:
在代码中使用双重否定会模糊原始参数
价值观
对于false
和nil
,这将返回false
,对于true
别的。起初,这似乎是一个非常聪明的简写
将任何真实值强制转换为true
,将任何非真实值强制转换为false
。
但在大多数情况下,您希望明确您的输入
参数(因为更容易对边缘情况进行推理,
代码路径和测试)
另外:nil
和false
确实意味着两件不同的事情
然而,需要这种灵活性的场景是
解析外部数据,如第三方JSON-API,其中值为
有时是null
,有时是false
,您希望进行规范化
在你的计划中公布之前。在这种情况下,你
最好通过引入一个助手使强制转换显式化
功能:
# preferred
defp present?(nil), do: false
defp present?(false), do: false
defp present?(_), do: true
这使您的代码比依赖于含义更显式
的代码>
在问题的示例中,这是必要的,因为如果:async
选项不存在,那么获取该键将导致nil
,但需要将其转换为false
,以便以后只查找布尔值的检查。这意味着对语句求反两次()。找到有关为什么在中执行此操作的最佳说明:
在代码中使用双重否定会模糊原始参数
价值观
对于false
和nil
,这将返回false
,对于true
别的。起初,这似乎是一个非常聪明的简写
将任何真实值强制转换为true
,将任何非真实值强制转换为false
。
但在大多数情况下,您希望明确您的输入
参数(因为更容易对边缘情况进行推理,
代码路径和测试)
另外:nil
和false
确实意味着两件不同的事情
然而,需要这种灵活性的场景是
解析外部数据,如第三方JSON-API,其中值为
有时是null
,有时是false
,您希望进行规范化
在你的计划中公布之前。在这种情况下,你
最好通过引入一个助手使强制转换显式化
功能:
# preferred
defp present?(nil), do: false
defp present?(false), do: false
defp present?(_), do: true
这使您的代码比依赖于含义更显式
的代码>
在问题的示例中,这是必要的,因为如果:async
选项不存在,则获取该键将导致nil
,但需要将其转换为false
,以便以后只查找布尔值的检查
# preferred
defp present?(nil), do: false
defp present?(false), do: false
defp present?(_), do: true