函数

时间:2015-09-09 17:03:11

标签: erlang ejabberd

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

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

我不明白[$< | _ ] = Data部分对数据的影响。有人可以解释一下吗?

3 个答案:

答案 0 :(得分: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 :(得分:1)

  

我不明白[$&lt; | _] =数据部分用于数据。可以   有人解释一下吗?

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

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

答案 2 :(得分:0)

这是一种让你的蛋糕同时吃的方式。 Data指的是整个事物,[$<|_]可以让你匹配它并将它拉开。然后将=maybe_post_request([$< | _ ] = Data, Host, ClientIp) 放在一起,可以同时执行这两种操作。在这种模式中,它通常被称为别名。这意味着双方在函数头(你在哪里看到它)的参数中匹配和顺序无关,所以函数头可以写成

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

_T

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

我个人更喜欢第一种选择,因为匹配,拉开给我。