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

时间:2015-11-10 18:49:30

标签: syntax erlang

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

例如:

 Request#radius_packet.attrs

2 个答案:

答案 0 :(得分: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...

记录是一种元语法;它们是预处理器的便利,实际上在编译之前就转换为元组(这就是为什么记录如此之快)。因此,鉴于#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 docs page on records.

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

AMap#{}
ARecord#record_type{}

Erlang docs page on map expressions.

答案 1 :(得分:4)

Request是记录绑定的变量。

#表示变量是记录。

radius_packet是记录的名称。

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