函数中的Erlang语法

3

我在Ejabberd中发现了这段代码:

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

我不理解[$< | _ ] = Data这部分与Data有什么关系。谁能解释一下吗?
3个回答

6
构造函数
[$< | _] = 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"

1

我不理解 [$< | _ ] = Data 这一段对于Data的作用是什么。有人能解释一下吗?

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

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


0

这是一种既能拥有蛋糕又能同时享用的方式。 Data 指的是整个东西,而 [$<|_] 则让您可以匹配并拆分它。然后使用 = 将其组合在一起,以模式允许您同时执行两个操作。在这样的模式中,通常称为 别名。这意味着两侧都必须匹配,在函数头部的参数(您看到它的地方)中,顺序无关紧要,因此函数头也可以编写为

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

或者

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

当然,在函数体或shell中它们并不等价。

我个人更喜欢第一个选择,因为它对我来说意味着匹配、拆开。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接