在Erlang语法中,"#"代表记录类型。例如:
Request#radius_packet.attrs
哈希标记在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...
记录是元语法; 它们是编译器预处理的便利,实际上在编译之前将被转换为元组(这就是为什么记录如此快速的原因)。因此,鉴于以下对#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...
上述版本仅忽略了记录语法,而是选择编写预处理器将创建的底层元组。
您还会在Map中看到哈希表。使用哈希表的Map语法类似于记录语法,但在哈希符号和左花括号之间没有任何类型名称:
AMap#{}
ARecord#record_type{}
Request
是该记录所绑定的变量。
#
表示该变量是一个记录。
radius_packet
是该记录的名称。
attrs
是您从该记录访问的字段。