Elixir函数名称中的问号和“ is_”

Kev*_*vin 4 elixir

我正在阅读Elixir的命名约定。它指出:

不能在防护中使用的谓词函数的名称应带有尾部问号(?),而不是is_(或类似名称)前缀。

因此,哪些功能不能用于防护?

Dog*_*ert 6

这三个函数都包含在警卫中有效的表达式;只是必须将自定义防护写成宏,而不是普通函数:

defmodule User do
  defstruct age: 0

  defmacro kid?(age) do
    quote do
      6 < unquote(age) and unquote(age) < 12
    end
  end

  defmacro teen?(age) do
    quote do
      12 < unquote(age) and unquote(age) < 18
    end
  end

  defmacro elder?(age) do
    quote do
      60 < unquote(age)
    end
  end
end

defmodule Greeting do
  import User

  def greet(%{age: age}) when kid?(age), do: "Hiya"
  def greet(%{age: age}) when teen?(age), do: "Whatever"
  def greet(%{age: age}) when elder?(age), do: "You kids get off my lawn"
  def greet(_), do: "Hello"
end

for age <- [0, 5, 10, 15, 20, 90] do
  IO.inspect {age, Greeting.greet(%{age: age})}
end
Run Code Online (Sandbox Code Playgroud)

输出:

{0, "Hello"}
{5, "Hello"}
{10, "Hiya"}
{15, "Whatever"}
{20, "Hello"}
{90, "You kids get off my lawn"}
Run Code Online (Sandbox Code Playgroud)