当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Kernel.defguard用法及代码示例


Elixir语言中 Kernel.defguard 相关用法介绍如下。

用法:

defguard(guard)
(从 1.6.0 开始) (宏)
@spec defguard(Macro.t()) :: Macro.t()

生成一个适用于保护表达式的宏。

如果定义使用了守卫中不允许的表达式,它会在编译时引发,否则会创建一个可以在守卫内部或外部使用的宏。

请注意,Elixir 中的约定是使用 is_ 前缀命名守卫中允许的函数/宏,例如 is_list/1 。但是,如果函数/宏返回布尔值并且不允许在守卫中使用,则它应该没有前缀并以问号结尾,例如 Keyword.keyword?/1

示例

defmodule Integer.Guards do
  defguard is_even(value) when is_integer(value) and rem(value, 2) == 0
end

defmodule Collatz do
  @moduledoc "Tools for working with the Collatz sequence."
  import Integer.Guards

  @doc "Determines the number of steps `n` takes to reach `1`."
  # If this function never converges, please let me know what `n` you used.
  def converge(n) when n > 0, do: step(n, 0)

  defp step(1, step_count) do
    step_count
  end

  defp step(n, step_count) when is_even(n) do
    step(div(n, 2), step_count + 1)
  end

  defp step(n, step_count) do
    step(3 * n + 1, step_count + 1)
  end
end

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Kernel.defguard(guard)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。