【问题标题】:How to find erlang ets table fields info?如何查找erlang ets表字段信息?
【发布时间】:2011-12-15 11:45:58
【问题描述】:

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

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

【问题讨论】:

    标签: erlang ets


    【解决方案1】:

    问题在于 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' 将分别“绑定”记录字段ac。这就是函数ets:matchets:match_objectets:match_object 以及ets:select 的扩展形式。

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

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

    抱歉这里有点过火了,我走神了。

    【讨论】:

    • 但是我们可以使用字段名称根据某些条件检索值,这就是为什么我认为可以获取字段名称的原因。
    • @niting112:有点,我在原始答案中包含了一个更长的解释作为编辑。
    猜你喜欢
    • 2011-02-17
    • 2016-06-03
    • 2012-10-14
    • 1970-01-01
    • 2011-10-18
    • 2020-08-11
    • 2019-02-05
    • 2016-09-10
    • 2021-01-19
    相关资源
    最近更新 更多