【问题标题】:Erlang syntax in function函数中的 Erlang 语法
【发布时间】:2015-09-15 20:45:19
【问题描述】:

我在 Ejabberd 中找到了这段代码:

maybe_post_request([$< | _ ] = Data, Host, ClientIp)

我不明白 [$&lt; | _ ] = Data 部分如何处理数据。谁能解释一下?

【问题讨论】:

    标签: erlang ejabberd


    【解决方案1】:

    结构

    [$< | _] = Data
    

    将模式匹配应用于Data,期望它是一个列表变量,其第一个元素是字符&lt;,并忽略其余元素。在 Erlang shell 中试一试:

    1> Data = "<foo>".
    "<foo>"
    2> [$<|_] = Data.
    "<foo>"
    

    但是如果Data 不匹配,我们会得到一个异常:

    3> f(Data), Data = "foo".
    "foo"
    4> [$<|_] = Data.
    ** exception error: no match of right hand side value "foo"
    

    【讨论】:

      【解决方案2】:

      我不明白 [$

      它将变量 Data 绑定到函数的整个第一个参数。

      左侧模式匹配第一个参数,因此该函数子句仅在第一个参数是以字符 &lt; 开头的字符串(列表)时匹配。变量 Data 被赋值为函数体中使用的整个字符串 fr。

      【讨论】:

        【解决方案3】:

        这是一种一边吃蛋糕一边吃蛋糕的方式。 Data 指的是整个事物,而 [$&lt;|_] 可让您匹配它并将其分开。然后将 = 放在一个模式中,您可以同时做这两个。在这样的模式中,它通常称为别名。这意味着双方非常匹配,并且在函数头中的参数(这是您看到的地方)顺序无关紧要,因此函数头可以写为

        maybe_post_request([$< | _ ] = Data, Host, ClientIp)
        

        maybe_post_request(Data = [$< | _ ], Host, ClientIp)
        

        当然在函数体或shell中它们是不等价的。

        我个人更喜欢第一种选择,因为它对我说匹配,分开

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-09
          • 2012-05-16
          • 1970-01-01
          • 2015-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-10
          相关资源
          最近更新 更多