erlang - 如何查找erlang ets表字段信息?

标签 erlang ets

在erlang中查找ets表的字段信息(即字段名称)的方法是什么?

我尝试过ets:info(TableName)ets:i(TableName)。第一个给出了有关表的详细信息,如内存、所有者、大小、named_table、keypos、保护等。第二个给出了有关表中存在的条目的详细信息。

最佳答案

问题是 ETS 适用于元组而不是记录,因此没有字段名称。即使您确实使用记录,ETS 也只能看到元组。

Mnesia 使用并了解记录。

编辑:对 @niting112 的评论进行更长的评论。

当然,记录只是元组的语法糖,除其他外,还提供命名字段。它们纯粹是编译时构造,并且在编译器的早期阶段,所有记录操作都转换为相应的元组操作。内部只有元组。记录名称成为元组中的第一个元素,字段是其他元素。

看到 ETS 在元组上工作,我们可以使用记录来定义表中的元组。因此,如果我们有:

-define(foo, {a,b=0,c}).

然后我们可以使用以下方法将对象添加到表中:

ets:insert(Table, #foo{a="Joe",c=1}),
ets:insert(Table, #foo{a="Robert,c=2}),
ets:insert(Table, #foo{a="Mike",c=3}),

我们添加了三个元组,每个元组包含 4 个元素。重要的是要记住,如果我们使用记录来定义表元素,那么我们应该确保将键位置设置为我们希望用作索引的记录字段的索引。默认情况下,关键位置是 1,这只是记录名称,这通常不是我们想要的。

我们可以使用“模式”从表中检索对象。请记住,Erlang 中没有模式数据类型,我们真正要做的是构建被解释为模式的元组。在这些“模式”中,原子 '$1''$2''$3'、... 被解释为变量,而原子'_' 被解释为无关变量。因此,我们可以使用元组 {foo,'$1','_','$2'} 作为模式,并使用变量 '$1''$2 ' 将分别“绑定(bind)”记录字段 ac。这是使用 ets:matchets:match_objectets:match_object 函数以及 中的扩展形式完成的操作ets:选择.

我们还可以使用记录定义来生成这些“模式”以从表中检索元素。我们只使用记录构造函数语法,因此 #foo{a='$1',b='_',c='$2'} 生成与前面示例相同的元组“模式”段落。记录有一些特殊的语法,对于生成这些“模式”非常有用:特殊的(通常是非法的)字段名称 _ 用于为所有未明确显示的字段定义默认值在构造函数中给出。因此,在这些情况下,我们可以使用 _='_' 将所有未指定的字段设置为“无关变量”'_'。非常适合 ets 匹配中的模式。因此,“模式”#foo{b=49,_='_'} 变为元组 {foo,'_',49,'_'}

注意这些不是正常模式匹配中使用的正常模式,而是 ETS 解释为模式的数据。非常不同的事情。

抱歉,我有点太过分了,我得意忘形了。

关于erlang - 如何查找erlang ets表字段信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7899049/

相关文章:

c++ - 使用 ei_encode_string 对字符串进行编码

operating-system - 如何在erlang中连续显示os命令输出?

erlang - 最好的分布式 Erlang 内存缓存是什么?

erlang - 如何确定ETS表的确切内存大小?

Erlang ETS 表事件

erlang - Erlang/Elixir 如何在现实世界中工作

ssl - Erlang SSL - 证书不适合 sni_fun 回调

erlang - 初学者安装模块最简单的方法是什么?

caching - 不使用保护子句过滤 erlang ets 表

erlang - 为什么 Erlang 字符串不能用作 ets 表名?