2011-09-29 47 views
8

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

但是,如何将记录与ETS表匹配?如果我有记录的表,我只能配合以下几点:

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

很明显,一旦我添加了一些新的领域,以记录定义这种模式匹配将停止工作。

相反,我想用这样的:

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

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

回答

16

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

您正在寻找
9

尝试使用

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

this的说明。