【问题标题】:Need help in understanding the Erlang code and what exactly it is doing需要帮助来理解 Erlang 代码以及它到底在做什么
【发布时间】:2018-08-01 04:58:12
【问题描述】:

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

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

【问题讨论】:

    标签: erlang erlang-shell


    【解决方案1】:

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

    最后两行对变量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},
    

    【讨论】:

    • 在上面贴出的代码中,它肯定是一个原子,而不是一个变量。它需要以大写字母开头,例如Confirmation,是一个变量。
    • 非常感谢您的解释和它的爆炸实际上Confirmation 是一个未绑定的变量而不是一个原子
    • 我已编辑代码并等待同行评审
    • 如果你能帮助我理解这个运算符:=,我将非常感激,它是否像一个未绑定的变量一样,它会复制键content的值,对于其他人它会检查如果map 中存在类似的模式。这就是说badMatch 错误如果发生,键content 的值将被复制到Confirmation
    • 我稍微扩展了答案。希望这是有道理的!
    猜你喜欢
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2021-07-29
    • 2010-11-04
    相关资源
    最近更新 更多