我正在存储一些数据在mnesia
,我想能够改变大部分涉及的值。Erlang动态记录编辑
天真
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
不是或_
。有没有一种方法可以像上面那样表示一般的插槽编辑功能,还是我会被定义为一大堆change_slot
s?
一个稍好一点的办法是拉出insert
和find
件
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},
...
,但还是有一点重复代码出现的。有什么方法可以将这种模式抽象出来吗?是否有一个确定的技术来允许编辑记录?任何想法一般?
请参阅http://www.erlang.org/doc/reference_manual/records.html中的第9.8节“记录的内部表示”。字段名称仅在编译时可用,所以您不能在#rec语法中使用字段名称的变量。 record_info()函数可能对你正在尝试做的事情有所帮助。 – RichardC