我在Ejabberd中找到了这段代码:
maybe_post_request([$< | _ ] = Data, Host, ClientIp)
我不明白[$< | _ ] = Data
部分对数据的影响。有人可以解释一下吗?
答案 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中它们并不等同。
我个人更喜欢第一种选择,因为匹配,拉开给我。