Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 为什么在解析选项映射输入时使用双感叹号(!!)?_Elixir - Fatal编程技术网

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
使用
ing
ExUnit.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