【问题标题】:How to match ets:match against a record in Erlang?如何匹配 ets:匹配 Erlang 中的记录?
【发布时间】:2011-11-27 12:39:32
【问题描述】:

我听说在代码中通过元组指定记录是一种不好的做法:我应该始终使用记录字段 (#record_name{record_field = something}) 而不是普通元组 {record_name, value1, value2, something}

但是如何将记录与 ETS 表进行匹配?如果我有一个包含记录的表,我只能匹配以下内容:

ets:match(Table, {$1,$2,$3,something}

很明显,一旦我在记录定义中添加了一些新字段,这个模式匹配就会停止工作。

相反,我想使用这样的东西:

ets:match(Table, #record_name{record_field=something})

不幸的是,它返回一个空列表。

【问题讨论】:

    标签: erlang tuples record ets


    【解决方案1】:

    您要查找的格式是#record_name{record_field=something, _ = '_'}

    http://www.erlang.org/doc/man/ets.html#match-2

    http://www.erlang.org/doc/programming_examples/records.html(参见 1.3 创建记录)

    【讨论】:

      【解决方案2】:

      问题的原因是当您执行#record_name{record_field=something} 时未指定的字段设置为什么。这是创建记录的语法,在这里您正在创建一个记录/元组,ETS 将其解释为一种模式。当您创建一条记录时,所有未指定的字段都将获得它们的默认值,要么是在记录定义中定义的要么是默认的默认值undefined

      因此,如果您想为字段指定特定值,则必须在记录中明确执行此操作,例如#record_name{f1='$1',f2='$2',record_field=something}。通常在使用记录和 ets 时,您希望将所有未指定的字段设置为 '_',即 ets 匹配的“无关变量”。对此有一个特殊的语法,使用特殊的,否则是非法的,字段名称_。例如#record_name{record_field=something,_='_'}

      请注意,在您的示例中,您已将元组中的 记录名称元素 设置为“$1”。表示记录的元组始终将记录名称作为第一个元素。这意味着当您创建 ets 表时,您应该将带有 {keypos,Pos} 的键位置设置为默认值 1 以外的其他值,否则将不会有任何索引,如果您有一个类型为“set”或“的表”,则更糟ordered_set' 你只会在表中得到 1 个元素。要获取记录字段的索引,您可以使用语法#Record.Field,在您的示例中为#record_name.record_field

      【讨论】:

      • 在这个例子之后:#record_name{f1='$1',f2='$2',record_field=something} 你给出了这个例子:#record_name{record_field=something,_='_'}. 这看起来就像写一次_='_' 将匹配所有其他字段——但在我的尝试中你必须写@每个附加字段为 987654334@。这意味着如果您将记录定义更改为具有更多或更少的字段,那么您还必须更改匹配规范——这显然并不理想。一件好事是:您不必指定要匹配的字段,例如record_field=something ,在元组中的正确位置...
      • ...您可以先指定要匹配的字段,然后使用正确的_='_' 编号。例如,使用此记录定义-record(user, {id, name, city}),您可以使用类似#user{city="London", _='_', _='_'} 的模式。
      【解决方案3】:

      尝试使用

      ets:match(Table, #record_name{record_field=something, _='_'})
      

      请参阅this 了解说明。

      【讨论】:

        猜你喜欢
        • 2016-10-27
        • 2021-06-20
        • 2018-01-08
        • 2013-06-25
        • 2010-11-02
        • 2021-02-06
        • 2011-11-10
        • 2012-09-09
        • 1970-01-01
        相关资源
        最近更新 更多