在理解 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
是一个包含至少两个键的映射,header
和 content
。 header
的值必须是包含至少一个键 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},
我发现很难破译这段代码。我可以理解有一个数据结构的实例;是记录还是地图?
查询是关于代码的最后两行,它是用 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
是一个包含至少两个键的映射,header
和 content
。 header
的值必须是包含至少一个键 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},