需要帮助来理解Erlang代码以及它究竟在做什么

时间:2018-02-21 14:48:47

标签: erlang erlang-shell

我是Erlang的新手并且发现很难破译这段代码,我可以理解,有一个数据结构的实例不确定它是一个记录或地图是什么?

查询是关于代码的最后两行是用Response更新记录还是检查message_code

Response =
  #{header=>
      #{message_code=>'CONN_ESTABLISH_REQUEST',
        protocol_instance=>?MGMT_PROTOCOL_IDENTIFIER,
        transaction_identifier=>1},
    content=>
      #{revision_list=>[0]}},

#{header := #{message_code := 'CONN_ESTABLISH_CONFIRM'},
      content := Confirmation} = Response

1 个答案:

答案 0 :(得分:2)

它是地图,而不是记录。 (如果是记录,记录名称将介于#{之间。)

最后两行在变量Response上执行模式匹配。该代码声称Response是包含至少两个密钥headercontent的地图。 header的值必须是包含至少一个键message_code的地图,其值为'CONN_ESTABLISH_CONFIRM'content的值将存储在变量Confirmation中。 如果Response的值不符合所有这些要求,则此代码将发出badmatch错误信号。

请注意,行为会有所不同,具体取决于:=的右侧是否包含:

  • 常数
  • 未绑定的变量
  • 绑定变量(已具有值的变量)

如果它是未绑定的变量,则该键的值只存储在该变量中。如果它是绑定变量,则该键的值必须与该变量的值匹配,否则会出现badmatch错误,就像非匹配常量一样。

如您所见,使用了两种不同的分隔符=>:=。在构建新地图(例如示例中的第一个表达式)时,您只能使用=>,而在模式匹配时,您只能使用:=。我们的想法是他们做了不同的事情:=>在地图中存储键值对,而:=提取现有的键值对。

还有另一种情况:更新现有地图。在这种情况下,您可以使用两者。 =>可用于向地图添加新密钥,而:=只能用于更新现有密钥,否则会发出badarg错误信号。例如,如果您想添加一个"页脚"到Response,您必须使用=>

NewResponse = Response#{footer => [some,data]},
%% this signals a badarg error:
NewResponse = Response#{footer := [some,data]},

如果您想更改content,可以使用以下任一项:

NewResponse = Response#{content := 42},
NewResponse = Response#{content => 42},