0

我尝试将两个 ETS 表合并为一个 ETS 表。我知道的唯一方法是创建第三个表并将这两个表的记录插入到第三个表中。有没有更好的办法?

4

1 回答 1

2

ets:insert允许一个元组列表。另一方面,ets:tab2list将 ets 表导出为元组列表。这意味着您可以轻松地将一个 ets 表导入到另一个表中。

不完全是一个联合,但你最终得到一个包含前两个表的表,而没有创建第三个 ets 表,这似乎是你试图实现的。

一个小例子:

ets:new(list_a,[named_table]).
ets:new(list_b,[named_table]).

ets:insert(list_a,{one,1}).
ets:insert(list_b,{two,2}).
ets:insert(list_b,{three,3}).

ets:insert(list_a,ets:tab2list(list_b)).

ets:tab2list(list_a).
% list_a = [{three,3},{two,2},{one,1}]

在相同键的情况下会发生什么取决于您正在使用的 ETS 表的类型(erlang doc):

如果表是一个集合,并且插入对象的键与表中任何对象的键匹配,则旧对象将被替换。如果表是一个ordered_set,并且插入对象的键与表中任何对象的键比较相等,则旧对象也将被替换。如果列表包含多个具有匹配键的对象并且表是一个集合,则将插入一个,其中一个未定义。同样的事情也适用于ordered_set,但如果键比较相等也会发生。

此外,您可能想要使用不会覆盖的ets:insert_new 。

于 2013-08-06T08:10:17.890 回答