【发布时间】:2015-12-03 15:27:45
【问题描述】:
我需要帮助以了解 elixir !、?、_ 和 . 中的以下语法。
这些语法在 elixir 的功能中起什么作用?例如Repo.get!。
我不确定它们是否只是函数名,还是有作用。虽然我知道. 是用来调用匿名函数的。和_ 用于任何或可变参数?
【问题讨论】:
标签: elixir
我需要帮助以了解 elixir !、?、_ 和 . 中的以下语法。
这些语法在 elixir 的功能中起什么作用?例如Repo.get!。
我不确定它们是否只是函数名,还是有作用。虽然我知道. 是用来调用匿名函数的。和_ 用于任何或可变参数?
【问题讨论】:
标签: elixir
首先是!和?
它们是通常应用于函数名称末尾的命名约定,并且不是任何特殊语法。
! - 如果函数遇到错误,将引发异常。
一个很好的例子是Enum.fetch!(它也有一个相同的Enum.fetch,它不会引发异常)。查找给定索引处的元素(从零开始)。 如果给定位置超出集合范围,则引发 OutOfBoundsError。
? - 用于表明该函数将返回一个布尔值,true 或 false。一个很好的例子是Enum.any?,如果函数对任何值都为真,则返回真,否则返回假
_ - 这将忽略函数或模式匹配中的参数。如果你喜欢,你可以在下划线之后给一个名字。Ex - _base
这通常用于尾递归函数的末尾。一个很好的例子是幂函数。如果您想将任何数字基数提高到 0,则结果为 1,所以基数是什么并不重要
defp getPower(_base,0), do: 1
. - 用于访问模块内的任何函数或按照您的建议调用匿名函数
iex(1)> square = fn(number) -> number * number end
iex(2)> square.(4)
【讨论】:
getPower 函数可以使用模式匹配:defp getPower(_base, 0), do: 1
! - 失败时引发异常的函数的约定。
? - 返回布尔值的函数的约定
_ - 用于忽略参数或模式匹配表达式的一部分。
. - 正如你提到的用于调用匿名函数,但也用于访问模块函数,例如Mod.a(arg)。
【讨论】:
_(例如_foobar)和仅包含的变量之间确实存在重要区别_(如def foo(_, _bar) do, _bar end)。尝试使用 _ 会导致编译时出现“未绑定变量”错误。带有下划线前缀_bar 的变量用于防止未使用变量的警告,并且不会阻止编译。它们的使用只会产生一个警告:“警告:设置后使用下划线变量“_bar”。前导下划线表示应该忽略该变量的值......”