mnesia:write/1 是如何知道 table 名字的?

How does mnesia:write/1 know the table name?

在 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 的 table 中,但是如果像 Row 这样的 Erlang 记录实际上只是元组,那么这将如何发生,而 mnesia:write/1不接受 table 名称的参数?

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

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);