Erlang语法中"#"是什么意思?
例如:
Request#radius_packet.attrs
Run Code Online (Sandbox Code Playgroud)
哈希标记在Erlang中可能意味着两件事:引用记录或引用地图.
上面的具体情况是引用具有变量名称Request,类型radius_packet和访问字段的记录attrs.此语法模仿以其他语言访问结构或对象上的字段(但要小心,因为它不相同).它直接等同于将该字段作为变量赋值的一部分引用,然后使用该变量.下面的三个版本some_function/1在传递给它们时都是等价的do_something/1:
some_function(Request = #radius_packet{attrs = Attrs}) ->
do_something(Attrs),
% Other things where we need Request also...
some_function(#radius_packet{attrs = Attrs}) ->
do_something(Attrs),
% Other things where we don't need Record...
some_function(Request) ->
do_something(Request#radius_packet.attrs),
% etc...
Run Code Online (Sandbox Code Playgroud)
记录是一种元语法; 它们是预处理器的便利,实际上在编译之前就转换为元组(这就是为什么记录如此之快).因此#radius_packet{},以下版本的以下定义some_function完全等同于上述版本:
-record #radius_packet{serial, headers, attrs}.
some_function({radius_packet, _, _, Attrs}) ->
do_something(Attrs),
% Other things where we don't need Record...
Run Code Online (Sandbox Code Playgroud)
上面的版本简单地忽略了记录语法,有利于写出将由预处理器创建的底层元组.
您将看到哈希的另一个地方是地图.使用哈希的地图语法看起来类似于记录语法,但在哈希和开放的curley括号之间没有任何类型名称:
AMap#{}
ARecord#record_type{}
Run Code Online (Sandbox Code Playgroud)