函数中的 Erlang 语法

Erlang syntax in function

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

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

我不明白 [$< | _ ] = Data 部分与数据有什么关系。有人可以解释一下吗?

结构

[$< | _] = Data

将模式匹配应用于 Data,期望它是一个列表变量,其第一个元素是字符 < 并忽略其余元素。在 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"

I don't understand what [$< | _ ] = Data part do with Data. Could somebody explain?

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

左侧模式匹配第一个参数,因此该函数子句仅在第一个参数是以字符 < 开头的字符串(列表)时匹配。变量 Data 被分配了函数主体中使用的整个字符串。

这是一种边吃边吃的方式。 Data 指的是整个事物,而 [$<|_] 可以让你匹配它并把它分开。将 then 与 = 放在一个模式中可以让您同时执行这两项操作。在这样的模式中,它通常被称为 alias。这意味着双方非常匹配并且 在函数 head 的参数中(这是你看到它的地方)顺序无关紧要所以函数 head 可以写成

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

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

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

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