【发布时间】:2015-09-15 20:45:19
【问题描述】:
我在 Ejabberd 中找到了这段代码:
maybe_post_request([$< | _ ] = Data, Host, ClientIp)
我不明白 [$< | _ ] = Data 部分如何处理数据。谁能解释一下?
【问题讨论】:
我在 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"
【讨论】:
我不明白 [$
它将变量 Data 绑定到函数的整个第一个参数。
左侧模式匹配第一个参数,因此该函数子句仅在第一个参数是以字符 < 开头的字符串(列表)时匹配。变量 Data 被赋值为函数体中使用的整个字符串 fr。
【讨论】:
这是一种一边吃蛋糕一边吃蛋糕的方式。 Data 指的是整个事物,而 [$<|_] 可让您匹配它并将其分开。然后将 = 放在一个模式中,您可以同时做这两个。在这样的模式中,它通常称为别名。这意味着双方非常匹配,并且在函数头中的参数(这是您看到的地方)顺序无关紧要,因此函数头可以写为
maybe_post_request([$< | _ ] = Data, Host, ClientIp)
或
maybe_post_request(Data = [$< | _ ], Host, ClientIp)
当然在函数体或shell中它们是不等价的。
我个人更喜欢第一种选择,因为它对我说匹配,分开。
【讨论】: