【发布时间】:2015-11-11 06:30:24
【问题描述】:
Erlang 语法中的“#”是什么意思?
例如:
Request#radius_packet.attrs
【问题讨论】:
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...
上面的版本简单地忽略了记录语法,而倾向于写出将由预处理器创建的底层元组。
您将看到哈希的另一个地方是地图。使用哈希的映射语法看起来类似于记录语法,但在哈希和左花括号之间没有任何类型名称:
AMap#{}
ARecord#record_type{}
【讨论】:
Request是记录绑定的变量。
#表示变量是一条记录。
radius_packet 是记录的名称。
attrs 是您从记录中访问的字段。
【讨论】: