代码之家  ›  专栏  ›  技术社区  ›  offby1

有没有更简单的方法来修改Erlang中subsubsub记录字段中的值?

  •  3
  • offby1  · 技术社区  · 16 年前

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

    只是 思考

    2 回复  |  直到 16 年前
        1
  •  4
  •   archaelus    16 年前

    正如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.
    
        2
  •  1
  •   Hynek -Pichi- Vychodil Paulo Suassuna    16 年前

    试试这个:

    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最强大的部分。