包 ETS 的 tab2list 中的顺序是什么?

What is the ordering in tab2list for bag ETS?

我在玩 bag table 一点:

30> W = ets:new(w, [bag]).
#Ref<0.616284823.3413770252.143386>
31> ets:insert(W, [{1, a}, {2, a}, {1, b}, {2, b}, {a}, {b}]).
true
32> ets:tab2list(W).
[{1,a},{1,b},{b},{a},{2,a},{2,b}]

我完全不明白这里的排序是如何工作的。为什么最小的元组在中间?它们如何大于 {1,_} 但小于 {2,_}


编辑:示例中的结果来自 OTP21

为什么您期望返回列表中有任何顺序,尤其是当您将 table 定义为“包”时。文档中没有关于返回列表顺序的假设。

顺便说一下,我 copy/paste 在我的 erlang shell 中输入了你的命令,但我得到了不同的结果:[{1,b},{1,a},{b},{a},{2,b},{2,a}]。没有结论,也许你没有 copy/paste 所有命令和结果,但 edit/modify 其中一些,也许结果取决于 ets 库版本,也许它取决于“实时”条件。

根据 ets:lookup/2 的文档:

The time order of object insertions is preserved.

这意味着当插入具有相同键的两个元组时,它们的顺序由插入的时间决定。我不知道这是否也适用于 ets:tab2list/1。无论如何,这是唯一的保证。而且,您的结果似乎与 ONE 保证一致。

我查看了 ets:tab2list/1 的源代码,它调用 ets:first/1-- 而不是 ets:lookup/2ets:first/1 的文档说:

For an ordered_set table, the first key in Erlang term order is returned. For other table types, the first key according to the internal order of the table is returned.

因为提到了 ordered_set 的 returned 键的顺序,但是据说 bag 的 returned 键的顺序是“根据 table 的内部顺序”,我认为您不能指望 ets:first/1 到 return 任何顺序的键。因此,您必须将 return 由 tab2list/1 编辑的列表视为无序。

而且,直接来自 rvirding 自己:

With a set, bag or duplicate_bag the order in which you get the keys is internal. This irrespective of whether you use match, select or first and next. I was referring to the ordering of elements of one key in a bag or duplicate_bag returned when doing a lookup, match or select [where the time order of object insertions is preserved; the first object inserted with the specified key is the first in the resulting list, and so on.]

[Otherwise,] the internal ordering of keys is not defined and you can never depend on it because as you say it can change between releases. Except of course for type ordered_set where the ordering is defined.

https://elixirforum.com/t/retrieval-in-ets/10413/2