erlang - 是否有更简单的方法来修改 Erlang 中 subsubsub 记录字段中的值?

标签 erlang records

所以我有一个相当深层次的记录定义:

-record(cat,            {name = '_',           attitude = '_',}).
-record(mat,            {color = '_',          fabric = '_'}).
-record(packet,         {cat = '_',            mat = '_'}).
-record(stamped_packet, {packet = '_',         timestamp = '_'}).
-record(enchilada,  {stamped_packet = '_', snarky_comment = ""}).

现在我有了一个辣酱 Jade 米饼馅,我想做一个新的 就像它一样,除了其中一个 subsubsubrecords 的值。 这就是我一直在做的事情。

update_attitude(Ench0, NewState)
  when is_record(Ench0, enchilada)->

    %% Pick the old one apart.
    #enchilada{stamped_packet     = SP0} = Ench0,
    #stamped_packet{packet = PK0} = SP0,
    #packet{cat = Tag0}    = PK0,

    %% Build up the new one.
    Tude1 = Tude0#cat{attitude = NewState},
    PK1 = PK0#packet{cat = Tude1},
    SP1 = SP0#stamped_packet{packet = PK1},

    %% Thank God that's over.
    Ench0#enchilada{stamped_packet = SP1}.

光是这件事就很痛苦。有没有更好的办法?

最佳答案

正如 Hynek 所建议的,您可以省略临时变量并执行以下操作:

update_attitude(E = #enchilada{stamped_packet = (P = #packet{cat=C})},
                NewAttitude) ->
    E#enchilada{stamped_packet = P#packet{cat = C#cat{attitude=NewAttitude}}}.

Yariv Sadan对同样的问题感到沮丧并写道 Recless , a type inferring parse transform for records这将允许你写:

-compile({parse_transform, recless}).

update_attitude(Enchilada = #enchilada{}, Attitude) ->
    Enchilada.stamped_packet.packet.cat.attitude = Attitude.

关于erlang - 是否有更简单的方法来修改 Erlang 中 subsubsub 记录字段中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/595247/

相关文章:

android - 是否有适用于 Android 的 Erlang 实现?

tcp - 通过 TCP Erlang 接收错误数据

Erlang子列表函数性能

MySQL删除多条记录

mysql - 选择除 A 或 B 之外的记录

mysql - 如何更新符合SQL条件的多行

windows - Docker 容器在启动后立即关闭

erlang - 帮助理解错误报告

f# - 如何在 F# 中创建没有度量的度量记录类型

sql-server-2008 - 在两个远程放置的服务器之间同步数据