9

我听说在代码中通过元组指定记录是一种不好的做法:我应该始终使用记录字段 ( #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})

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

4

3 回答 3

17

问题的原因是当您执行#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

于 2011-09-29T10:33:45.607 回答
10

尝试使用

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

请参阅进行解释。

于 2011-09-29T10:28:37.700 回答
4

您正在寻找的格式是 #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 创建记录)

于 2011-09-29T10:48:54.237 回答