gpt4 book ai didi

dynamic - Erlang动态记录编辑

转载 作者:行者123 更新时间:2023-12-04 23:06:36 24 4
gpt4 key购买 nike

我正在 mnesia 中存储一些数据,并且我希望能够更改所涉及的大多数值。

天真的

change(RecordId, Slot, NewValue) ->
[Rec] = do(qlc:q([X || X <- mnesia:table(rec), X#rec.id =:= RecordId])),
NewRec = Rec#rec{Slot=NewValue},
F = fun() -> mnesia:write(NewRec) end,
{atomic, Val} = mnesia:transaction(F),
Val.

不这样做;编译器提示 Slot不是 atom_ .有没有办法像上面一样表达通用插槽编辑功能,或者我会被困在定义一大堆 change_slot ?

稍微好一点的方法是取出 insertfind
atomic_insert(Rec) ->
F = fun() -> mnesia:write(Rec) end,
{atomic, Val} = mnesia:transaction(F),
Val.

find(RecordId) ->
[Rec] = do(qlc:q([X || X <- mnesia:table(rec), X#rec.id =:= RecordId])),
Rec.

change(RecordId, name, NewValue) ->
Rec = find(RecordId),
NewRec = Rec#rec{name=NewValue},
atomic_insert(NewRec);
change(RecordId, some_other_property, NewValue) ->
Rec = find(RecordId),
NewRec = Rec#rec{some_other_property=NewValue},
...

但是那里仍然有一些代码重复。有没有办法抽象出这种模式?是否有允许编辑记录的成熟技术?一般有什么想法吗?

最佳答案

由于记录由元组表示,您可以尝试使用元组操作来设置单个值。

-module(rec).
-export([field_num/1, make_rec/0, set_field/3]).
-record(rec, {slot1, slot2, slot3}).

make_rec() ->
#rec{slot1=1, slot2=2, slot3=3}.

field_num(Field) ->
Fields = record_info(fields, rec),
DifField = fun (FieldName) -> Field /= FieldName end,
case length(lists:takewhile(DifField, Fields)) of
Length when Length =:= length(Fields) ->
{error, not_found};
Length ->
Length + 2
end.

set_field(Field, Value, Record) ->
setelement(field_num(Field), Record, Value).

set_field 将返回更新的记录:
Eshell V5.9.1  (abort with ^G)
1> c(rec).
{ok,rec}
2> A = rec:make_rec().
{rec,1,2,3}
3> B = rec:set_field(slot3, other_value, A).
{rec,1,2,other_value}

关于dynamic - Erlang动态记录编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10821930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com