在Erlang中,"#"代表什么?

4
在Erlang语法中,"#"代表记录类型。例如:
 Request#radius_packet.attrs
2个回答

9

哈希标记在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...

上述版本仅忽略了记录语法,而是选择编写预处理器将创建的底层元组。

Erlang文档页面有关记录的说明。

您还会在Map中看到哈希表。使用哈希表的Map语法类似于记录语法,但在哈希符号和左花括号之间没有任何类型名称:

AMap#{}
ARecord#record_type{}

Erlang文档页面-关于Map表达式。


6

Request 是该记录所绑定的变量。

# 表示该变量是一个记录。

radius_packet 是该记录的名称。

attrs 是您从该记录访问的字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接