Erlang mnesia:write/1如何知道表名?

Erlang mnesia:write/1如何知道表名?,erlang,mnesia,Erlang,Mnesia,在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的表中,但是如果

在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不使用参数作为表名,那么该行是如何发生的呢?

记录是元组,其中第一个元素是命名记录的原子,在本例中是
shop
。在mnesia源代码中,您可以看到它如何提取第一个元素用作表名

write(Val) when is_tuple(Val), tuple_size(Val) > 2 ->
    Tab = element(1, Val),
    write(Tab, Val, write);