【发布时间】:2013-08-03 18:01:12
【问题描述】:
我尝试将两个 ETS 表合并为一个 ETS 表。 我知道的唯一方法是创建第三个表并将这两个表的记录插入到第三个表中。 有没有更好的办法?
【问题讨论】:
我尝试将两个 ETS 表合并为一个 ETS 表。 我知道的唯一方法是创建第三个表并将这两个表的记录插入到第三个表中。 有没有更好的办法?
【问题讨论】:
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,它不会覆盖。
【讨论】: