2

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

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

4

1 回答 1

3

问题是 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'并将分别“绑定”记录字段ac。这是对函数所做的,ets:match也是在.ets:match_objectets:match_objectets:select

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

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

抱歉在这里有点过火了,我得意忘形了。

于 2011-10-26T15:15:51.367 回答