在Joe Armstrong关于Erlang的书中,有一个插入mnesia数据库的例子:
add_shop_item(Name, Quantity, Cost) ->
Row = #shop{item=Name, quantity=Quantity, cost=Cost},
F = fun() ->
mnesia:write(Row)
end,
mnesia:transaction(F).
该行被插入一个名为shop
的表中,但如果像Row
这样的Erlang记录实际上只是元组,那么会发生什么呢?而mnesia:write / 1不会为表名?
答案 0 :(得分:1)
记录是元组,其中第一个元素是命名记录的原子,在本例中为shop
。在mnesia源代码中,您可以看到它如何提取第一个要用作表名的元素。
https://github.com/erlang/otp/blob/maint/lib/mnesia/src/mnesia.erl#L511-L513
write(Val) when is_tuple(Val), tuple_size(Val) > 2 ->
Tab = element(1, Val),
write(Tab, Val, write);