erlang 不同ETS检查床类型之间有何区别?

xdyibdwo  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(285)

根据手册,ETS表有4种类型:

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

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

y53ybaqx

y53ybaqx1#

第一个月

这是一个常规Map,其中每个键都是唯一的,并且引用一个元组。每次对单个键的后续写入都将覆盖该键下的现有条目。

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}]

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}]

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}]

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}]

相关问题