查找字段info的方法是什么?
我已经尝试过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'
将分别"绑定"记录字段a
和c
。这是用ets:match
, ets:match_object
和ets:match_object
函数完成的,也是ets:select
的扩展形式。
我们还可以使用记录定义来生成这些从表中检索元素的"模式"。我们只使用记录构造函数语法,因此#foo{a='$1',b='_',c='$2'}
生成与前一段中的示例相同的元组"模式"。记录有一些特殊的语法,这对于生成这些"模式"非常有用:特殊(通常是非法的)字段名_
用于为构造函数中未显式给出的所有字段定义默认值。所以在这些情况下,我们可以使用_='_'
将所有未指定的字段设置为"不关心变量"'_'
。完美的模式在ets匹配。因此"pattern" #foo{b=49,_='_'}
变成了元组{foo,'_',49,'_'}
。
注意:这些是在正常模式匹配中使用的非正常模式,但被ETS解释为模式的数据。
很抱歉我说得有点过火了,我有点忘乎所以了。