【问题标题】:In erlang, how do I interpret the `+` operator in `fun erlang:'+'/2`在erlang中,如何解释`fun erlang:'+'/2`中的`+`运算符
【发布时间】:2022-01-03 02:11:27
【问题描述】:

我是Erlang 的新手,但对Elixir 有一些经验。当我在尝试 RabbitMQ 的 RAFT 实现时一直在尝试学习 Erlang,ra,我遇到了line in erlang Machine = {simple, fun erlang:'+'/2, 0},

Machine = {simple, fun erlang:'+'/2, 0},

所以,在{simple, fun erlang:'+'/2, 0}, 中,这看起来像是在创建一个元组。元组中的第一项是名为simpleatom,下一项是function,最后一项是integer

{atom, function, integer}

我不明白fun erlang:'+'/2 函数在这种情况下的作用。 /2 表示它需要 2 个参数。 '+' 只是一个加法运算符吗?如果是这样,这是一个简单的sum 函数吗?我想多了? erlang 文档说"An atom is to be enclosed in single quotes (') if it does not begin with a lower-case letter or if it contains other characters than alphanumeric characters, underscore (_), or @."

在我看到此代码的给定context 中,它声明State machine that implements the logic,这使我将此状态机理解为以原子simple 命名,执行加法并将结果保存在元组的最后一项。

是否相当于在灵药中做&:erlang.+/2Doc Reference

任何上下文都会有帮助。

【问题讨论】:

  • 是的,就是加法运算符。
  • 为什么是单引号?
  • 因为它不是以小写字母开头的。

标签: rabbitmq erlang elixir


【解决方案1】:

你完全正确 - 这个函数只是加法运算符,它用单引号括起来,因为它不是以小写字母开头。 fun erlang:'+'/2 相当于 Elixir 的 &:erlang.+/2

您可以使用函数语法而不是运算符语法来调用它:

> erlang:'+'(1,2).
3

您可以将其用作高阶函数:

> lists:foldl(fun erlang:'+'/2, 0, [1, 2, 3]).
6

(当然,您通常会使用lists:sum/1 而不是后一个示例。)

【讨论】:

  • 谢谢!这个我真的是想多了。在 elixir -> erlang 与 Atoms 和 Single Quotes 的区别之间,看起来很明显,但也不太明显。
【解决方案2】:

根据 Erlang 文档,这种特殊用法是指定 Fun expression 的一种形式,而这种形式是 fun Module:Name/Arity

【讨论】:

    猜你喜欢
    • 2016-04-30
    • 2016-08-15
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多