我尝试将两个ETS表联合到一个ETS表中。 我知道的唯一方法是创建第三个表并在第三个表中插入两个表的记录。 还有更好的方法吗?
答案 0 :(得分: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,但不会覆盖。