在erlang中查找ets表的字段信息(即字段名称)有什么方法?
我尝试了 ets:info(TableName), ets:i(TableName)。第一个提供有关表的详细信息,如内存,所有者,大小,named_table,keypos,保护等。第二个提供有关表中的条目的详细信息。
答案 0 :(得分: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'
将分别“绑定”记录字段a
和c
。这是使用函数ets:match
,ets:match_object
和ets:match_object
以及ets:select
中的扩展形式完成的。
我们还可以使用记录定义生成这些“模式”以从表中检索元素。我们只使用记录构造函数语法,因此#foo{a='$1',b='_',c='$2'}
生成与前一段中的示例相同的元组“模式”。记录有一些特殊的语法,对于生成这些“模式”非常有用:特殊(通常是非法的)字段名称_
用于为所有字段定义默认值,这些字段未在构造函数。因此,在这些情况下,我们可以使用_='_'
将所有未指定的字段设置为“不关心变量”'_'
。适合ets匹配的模式。因此,“模式”#foo{b=49,_='_'}
成为元组{foo,'_',49,'_'}
。
<强> N.B。这些是正常模式匹配中使用的非正常模式,但是数据被ETS解释为模式。非常不同的事情。
很抱歉这里有点过火,我被带走了。