"#"在Erlang语法中意味着什么?
例如:
Request#radius_packet.attrs
答案 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...
上述版本只是忽略了记录语法,而有利于写出将由预处理器创建的基础元组。
您将看到哈希的另一个地方是地图。使用哈希的地图语法看起来类似于记录语法,但在哈希和开放的curley括号之间没有任何类型名称:
AMap#{}
ARecord#record_type{}
答案 1 :(得分:4)
Request
是记录绑定的变量。
#
表示变量是记录。
radius_packet
是记录的名称。
attrs
是您从记录中访问的字段。