Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何查找erlang ets表字段信息?_Erlang_Ets - Fatal编程技术网

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

如何查找erlang ets表字段信息?,erlang,ets,Erlang,Ets,在erlang中查找ets表的字段infoi.e字段名的方法是什么 我试过ets:infoTableName,ets:iTableName。第一个给出了表的详细信息,如内存、所有者、大小、命名表、keypos、保护等。第二个给出了表中存在的条目的详细信息。问题是ETS工作于元组而不是记录,因此没有字段名。即使使用记录,ETS也只能看到元组 Mnesia使用并了解记录 编辑:@niting112评论的较长评论 当然,记录只是元组的语法糖,提供命名字段等。它们纯粹是编译时构造,在编译器的早期阶段,所

在erlang中查找ets表的字段infoi.e字段名的方法是什么


我试过ets:infoTableName,ets:iTableName。第一个给出了表的详细信息,如内存、所有者、大小、命名表、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”。。。被解释为变量,原子“\u1”被解释为不关心变量。因此,我们可以使用元组{foo',1',2'}作为模式,变量'$1'和'$2'将分别绑定到记录字段a和c。这是使用函数ets:match、ets:match_object和ets:match_object以及ets:select中的扩展形式完成的

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

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


很抱歉,这里有点过火,我有些激动。

但是我们可以使用字段名根据某些条件检索值,这就是为什么我认为可以获取字段名的原因。@niting112:有点,我在原始答案中包含了一个较长的解释作为编辑。