某些 ETS 表类型之间有什么区别?

问题描述

根据 manual 有 4 种类型的 ETS 表:

  • set – 该表是一个集合表:一个键,一个对象,对象之间没有顺序。这是认的表类型。
  • ordered_set - 该表是一个ordered_set表:一个键,一个对象,按Erlang术语顺序排序,这是运算符隐含的顺序。在某些情况下,这种类型的表的行为与其他类型的表有些不同。最值得注意的是,ordered_set 表在比较相等时将键视为相等,而不仅仅是在它们匹配时。这意味着对于一个ordered_set 表,integer() 1 和float() 1.0 被认为是相等的。这也意味着用于查找元素的键不一定与返回元素中的键匹配,如果 float() 和 integer() 混合在表的键中。
  • bag – 该表是一个包表,可以有很多对象,但每个键只能有一个对象的实例。
  • duplicate_bag – 该表是一个 duplicate_bag 表,每个键可以有多个对象,包括同一对象的多个副本。

虽然我从他们的描述中并没有真正理解它们之间的区别。这里的“对象”和“对象的实例”是什么?

解决方法

set

它是一个常规映射,其中每个键都是唯一的,并且指向一个元组。对单个键的每次后续写入将始终覆盖该键下的现有条目。

1> T = ets:new(t,[set]).
2> ets:insert(T,{1,a}).
3> ets:insert(T,b}).
3> ets:insert(T,b}).
4> ets:insert(T,{1.0,c}).
5> ets:lookup(T,1).
[{1,b}]

ordered_set

就像 set 一样,但保持元素按标准比较运算符排序并通过 == 运算符解决相等性。因此键 11.0 被视为等效。

1> T = ets:new(t,1).
[{1.0,c}]

bag

它是一个独特的元组集合。条目可以共享密钥,只要它们在值的某处不同即可。

1> T = ets:new(t,[bag]).
2> ets:insert(T,a},b}]

duplicate_bag

bag 相同,但不唯一。元组可以重复意味着每次添加相同元素都会向表中添加新条目

1> T = ets:new(t,[duplicate_bag]).
2> ets:insert(T,b},b}]