函数中的 Erlang 语法
Erlang syntax in function
我在 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"
I don't understand what [$< | _ ] = Data part do with Data. Could
somebody explain?
它将变量 Data 绑定到函数的整个第一个参数。
左侧模式匹配第一个参数,因此该函数子句仅在第一个参数是以字符 <
开头的字符串(列表)时匹配。变量 Data 被分配了函数主体中使用的整个字符串。
这是一种边吃边吃的方式。 Data
指的是整个事物,而 [$<|_]
可以让你匹配它并把它分开。将 then 与 =
放在一个模式中可以让您同时执行这两项操作。在这样的模式中,它通常被称为 alias。这意味着双方非常匹配并且 在函数 head 的参数中(这是你看到它的地方)顺序无关紧要所以函数 head 可以写成
maybe_post_request([$< | _ ] = Data, Host, ClientIp)
或
maybe_post_request(Data = [$< | _ ], Host, ClientIp)
当然在函数体或shell中它们是不等价的。
我个人更喜欢第一种选择,因为它对我说匹配,分开。
我在 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"
I don't understand what [$< | _ ] = Data part do with Data. Could somebody explain?
它将变量 Data 绑定到函数的整个第一个参数。
左侧模式匹配第一个参数,因此该函数子句仅在第一个参数是以字符 <
开头的字符串(列表)时匹配。变量 Data 被分配了函数主体中使用的整个字符串。
这是一种边吃边吃的方式。 Data
指的是整个事物,而 [$<|_]
可以让你匹配它并把它分开。将 then 与 =
放在一个模式中可以让您同时执行这两项操作。在这样的模式中,它通常被称为 alias。这意味着双方非常匹配并且 在函数 head 的参数中(这是你看到它的地方)顺序无关紧要所以函数 head 可以写成
maybe_post_request([$< | _ ] = Data, Host, ClientIp)
或
maybe_post_request(Data = [$< | _ ], Host, ClientIp)
当然在函数体或shell中它们是不等价的。
我个人更喜欢第一种选择,因为它对我说匹配,分开。