在理解 Erlang 代码以及它到底在做什么方面需要帮助

Need help in understanding the Erlang code and what exactly it is doing

我发现很难破译这段代码。我可以理解有一个数据结构的实例;是记录还是地图?

查询是关于代码的最后两行,它是用 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

这是地图,不是记录。 (如果它是一条记录,记录名称将在 #{ 之间。)

最后两行对变量Response执行模式匹配。代码断言 Response 是一个包含至少两个键的映射,headercontentheader 的值必须是包含至少一个键 message_code 的映射,其值为 'CONN_ESTABLISH_CONFIRM'content 的值将存储在变量 Confirmation 中。 如果 Response 的值不符合 所有 这些要求,此代码将发出 badmatch 错误信号。

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

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

如果它是未绑定变量,则该键的值将简单地存储在该变量中。如果它是绑定变量,则该键的值 必须 与该变量的值匹配,否则您将得到 badmatch 错误,就像 non-matching 常量一样.


如您所见,使用了两个不同的定界符,=>:=。构造新映射时(比如你例子中的第一个表达式),只能用=>,模式匹配时,只能用:=。这个想法是他们做不同的事情:=> 在映射中存储一个 key-value 对,而 := 提取一个现有的 key-value 对。

还有一种情况:更新现有地图。在这种情况下,您可以同时使用两者。 => 可用于向地图添加新键,而 := 只能用于更新现有键,否则会发出 badarg 错误信号。例如,如果要将 "footer" 添加到 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},