【问题标题】:What does " # " mean in Erlang?“#”在 Erlang 中是什么意思?
【发布时间】:2015-11-11 06:30:24
【问题描述】:

Erlang 语法中的“#”是什么意思?

例如:

 Request#radius_packet.attrs

【问题讨论】:

    标签: syntax erlang


    【解决方案1】:

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

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

    AMap#{}
    ARecord#record_type{}
    

    Erlang docs page on map expressions.

    【讨论】:

      【解决方案2】:

      Request是记录绑定的变量。

      #表示变量是一条记录。

      radius_packet 是记录的名称。

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

      【讨论】:

        猜你喜欢
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 2011-08-12
        相关资源
        最近更新 更多