我是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
答案 0 :(得分:2)
它是地图,而不是记录。 (如果是记录,记录名称将介于#
和{
之间。)
最后两行在变量Response
上执行模式匹配。该代码声称Response
是包含至少两个密钥header
和content
的地图。 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},