我在Ejabberd中发现了这段代码:
maybe_post_request([$< | _ ] = Data, Host, ClientIp)
我不理解
[$< | _ ] = Data
这部分与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"
我不理解 [$< | _ ] = Data 这一段对于Data的作用是什么。有人能解释一下吗?
它将变量Data绑定到函数的整个第一个参数。
左侧模式匹配第一个参数,因此只有当第一个参数是以字符<
开头的字符串(列表)时,该函数子句才匹配。变量Data被赋予整个字符串以在函数体中使用。
这是一种既能拥有蛋糕又能同时享用的方式。 Data
指的是整个东西,而 [$<|_]
则让您可以匹配并拆分它。然后使用 =
将其组合在一起,以模式允许您同时执行两个操作。在这样的模式中,通常称为 别名。这意味着两侧都必须匹配,在函数头部的参数(您看到它的地方)中,顺序无关紧要,因此函数头也可以编写为
maybe_post_request([$< | _ ] = Data, Host, ClientIp)
或者
maybe_post_request(Data = [$< | _ ], Host, ClientIp)
当然,在函数体或shell中它们并不等价。
我个人更喜欢第一个选择,因为它对我来说意味着匹配、拆开。