所以我有一个相当深层次的记录定义:
-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/