4

我似乎不完全理解 -on_load 指令是如何工作的。在我编写的一个模块中,我有一个函数来初始化一个 ets 表并用一些数据填充它。此函数在显式调用时正常工作。但是:我认为如果在加载模块时“自动”填充 ets 表会很好。但这似乎不起作用,因为ets:info(filesig)在加载模块后告诉我“未定义”。相关代码如下所示:

...

-on_load(init/0),

init() ->
    % load filesig database into ETS
    {_, Signatures} = file:consult("path to a file"),

    ets:new(filesig, [set, protected, named_table]),
    ets:insert(filesig, Signatures),

    ok.

...

我已经在 erlang shell 中对其进行了测试。对我有什么提示,我做错了什么?

4

1 回答 1

4

手册说此代码在新生成的进程中运行,该进程在函数返回时立即终止。

一旦拥有进程终止,您创建的 ETS 表将被删除。这是标准的 ETS 行为。这是ets 手册页中提到的内容:

请注意,表没有自动垃圾收集。即使没有任何进程对表的引用,它也不会自动销毁,除非所有者进程终止。可以使用 delete/1 显式销毁它。默认所有者是创建表的进程。表所有权可以在进程终止时通过使用 heir 选项或通过调用 give_away/3 显式转移。

于 2012-10-09T15:19:11.557 回答