不同 ETS 表类型之间有什么区别?

rad*_*row 3 erlang ets data-structures

根据说明书 ETS 表有 4 种类型:

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

虽然我从他们的描述中不太明白它们之间的区别。这里的“对象”和“对象实例”是什么?

\n

rad*_*row 7

set

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

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

ordered_set

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

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

bag

它是一个独特的元组集合。只要条目的值在某些地方有所不同,它们就可以共享键。

1> T = ets:new(t, [bag]).
2> ets:insert(T, {1, a}).
3> ets:insert(T, {1, b}).
4> ets:insert(T, {1, b}).
4> ets:insert(T, {1.0, c}).
5> ets:lookup(T, 1).
[{1,a},{1,b}]
Run Code Online (Sandbox Code Playgroud)

duplicate_bag

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

1> T = ets:new(t, [duplicate_bag]).
2> ets:insert(T, {1, a}).
3> ets:insert(T, {1, b}).
4> ets:insert(T, {1, b}).
4> ets:insert(T, {1.0, c}).
5> ets:lookup(T, 1).
[{1,a},{1,b},{1,b}]
Run Code Online (Sandbox Code Playgroud)