【问题标题】:What's the meaning of "!", "?", "_", and "." syntax in elixir“!”、“?”、“_”和“.”是什么意思?长生不老药中的语法
【发布时间】:2015-12-03 15:27:45
【问题描述】:

我需要帮助以了解 elixir !?_. 中的以下语法。 这些语法在 elixir 的功能中起什么作用?例如Repo.get!

我不确定它们是否只是函数名,还是有作用。虽然我知道. 是用来调用匿名函数的。和_ 用于任何或可变参数?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    首先是

    它们是通常应用于函数名称末尾的命名约定,并且不是任何特殊语法。

    ! - 如果函数遇到错误,将引发异常。

    一个很好的例子是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
    【解决方案2】:

    ! - 失败时引发异常的函数的约定。

    ? - 返回布尔值的函数的约定

    _ - 用于忽略参数或模式匹配表达式的一部分。

    . - 正如你提到的用于调用匿名函数,但也用于访问模块函数,例如Mod.a(arg)

    【讨论】:

    • _(例如_foobar)和仅包含的变量之间确实存在重要区别_(如def foo(_, _bar) do, _bar end)。尝试使用 _ 会导致编译时出现“未绑定变量”错误。带有下划线前缀_bar 的变量用于防止未使用变量的警告,并且不会阻止编译。它们的使用只会产生一个警告:“警告:设置后使用下划线变量“_bar”。前导下划线表示应该忽略该变量的值......”
    • is_integer 没有问号有什么原因吗? - hexdocs.pm/elixir/Kernel.html#is_integer/1@Marc
    猜你喜欢
    • 2019-07-30
    • 2021-09-04
    • 1970-01-01
    • 2016-02-01
    • 2020-08-22
    • 2018-05-29
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    相关资源
    最近更新 更多