"#"在Erlang中意味着什么?

Мар*_*я М 2 syntax erlang

Erlang语法中"#"是什么意思?

例如:

 Request#radius_packet.attrs
Run Code Online (Sandbox Code Playgroud)

zxq*_*xq9 8

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

上面的版本简单地忽略了记录语法,有利于写出将由预处理器创建的底层元组.

Erlang docs记录页面.

您将看到哈希的另一个地方是地图.使用哈希的地图语法看起来类似于记录语法,但在哈希和开放的curley括号之间没有任何类型名称:

AMap#{}
ARecord#record_type{}
Run Code Online (Sandbox Code Playgroud)

Erlang docs关于地图表达式的页面.


nu-*_*-ex 6

Request是记录绑定到的变量。

#表示变量是一条记录。

radius_packet是记录的名称。

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