【发布时间】:2011-12-15 11:45:58
【问题描述】:
在erlang中查找ets表的字段信息(即字段名称)的方法是什么?
我尝试过 ets:info(TableName)、ets:i(TableName)。第一个提供有关表的详细信息,如内存、所有者、大小、named_table、keypos、保护等。第二个提供有关表中存在的条目的详细信息。
【问题讨论】:
在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 个元素。重要的是要记住,如果我们使用记录来定义表格元素,那么我们应该确保将 key position 设置为我们希望用作索引的记录字段的索引。默认情况下,关键位置是 1,这只是记录名称,通常不是我们想要的。
我们可以使用“模式”从表中检索对象。请记住,Erlang 中没有模式数据类型,我们真正要做的是构造元组,这些元组解释为模式。在这些“模式”中,原子'$1'、'$2'、'$3'、...被解释为变量,原子'_' 被解释为无关变量。所以我们可以使用元组{foo,'$1','_','$2'} 作为模式,变量'$1' 和'$2' 将分别“绑定”记录字段a 和c。这就是函数ets:match、ets:match_object 和ets:match_object 以及ets:select 的扩展形式。
我们还可以使用记录定义来生成这些“模式”以从表中检索元素。我们只是使用记录构造函数语法,所以#foo{a='$1',b='_',c='$2'} 生成与上一段中的示例相同的元组“模式”。记录有一些特殊的语法对于生成这些“模式”非常有用:特殊的(通常是非法的)字段名称_ 用于为构造函数中未明确给出的所有字段定义默认值。所以在这些情况下,我们可以使用_='_' 将所有未指定的字段设置为“无关变量”'_'。非常适合 ets 匹配中的模式。所以“模式”#foo{b=49,_='_'}变成了元组{foo,'_',49,'_'}。
注意这些是在正常模式匹配中使用的非正常模式,而是由 ETS 解释为模式的数据。非常不同的东西。
抱歉这里有点过火了,我走神了。
【讨论】: