【问题标题】:Is there an easier way to modify a value in a subsubsub record field in Erlang?有没有更简单的方法来修改 Erlang 的 subsubsub 记录字段中的值?
【发布时间】:2009-02-27 15:36:37
【问题描述】:

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

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

现在我有一个辣酱玉米饼馅,我想做一个新的 就像它一样,除了子子子记录之一的值。 这就是我一直在做的事情。

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}.

只是思考这件事很痛苦。有没有更好的办法?

【问题讨论】:

    标签: erlang records


    【解决方案1】:

    正如 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 对同样的问题感到沮丧,并写了Reclessa type inferring parse transform for records 这将允许你写:

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

    【讨论】:

      【解决方案2】:

      试试这个:

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

      无论如何,结构并不是 Erlang 最强大的部分。

      【讨论】:

        猜你喜欢
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        • 2017-07-16
        • 1970-01-01
        • 1970-01-01
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多