微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

包 ETS 在 tab2list 中的排序是什么?

如何解决包 ETS 在 tab2list 中的排序是什么?

我在玩 bag 表:

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

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


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

解决方法

根据 ets:lookup/2 的文档:

对象插入的时间顺序被保留。

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

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

对于一个ordered_set表,Erlang term order中的第一个key是 回来。对于其他表类型,第一个键根据 返回表的内部顺序。

因为提到了从ordered_set返回的键的顺序,但是从bag返回的键的顺序据说是“按照表的内部顺序”,我不要认为您可以指望 ets:first/1 以任何顺序返回密钥。因此,您必须将 tab2list/1 返回的列表视为无序。

而且,直接来自于自己:

使用 set、bag 或 duplicate_bag 获取钥匙的顺序 是内部的。无论您使用 matchselect 还是 firstnext。我指的是一个元素的顺序 执行 lookupmatch 时返回包中的密钥或重复包 或 select [其中对象插入的时间顺序被保留;使用指定键插入的第一个对象是结果列表中的第一个对象,依此类推。]

[否则,] 键的内部顺序没有定义,你永远不能依赖 因为正如你所说,它可以在不同版本之间改变。除了 定义排序的ordered_set 类型的课程。

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

,

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

顺便说一下,我将您的命令复制/粘贴到我的 erlang shell 中,但得到了不同的结果:[{1,b},{1,a},{b},{a},{2,a}]。没有结论,也许你没有复制/粘贴所有的命令和结果,而是编辑/修改了其中的一些,也许结果取决于 ets 库版本,也许取决于“实时”条件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。