我听说在代码中通过元组指定记录是一种不好的做法:我应该总是使用记录字段(#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})
不幸的是,它返回一个空列表。
3条答案
按热度按时间i7uaboj41#
问题的原因是当你执行
#record_name{record_field=something}
时,未指定的字段被设置成了什么。这是 creating a record的语法,这里你创建了一个记录/元组,ETS将把它解释为一个模式。当你创建一个记录时,所有未指定的字段将得到它们的默认值,或者是记录定义中定义的值,或者是默认的默认值undefined
。因此,如果你想给予字段指定值,那么你必须在记录中明确地这样做,例如
#record_name{f1='$1',f2='$2',record_field=something}
。通常当使用记录和ets时,你想把所有未指定的字段设置为'_'
,这是ets匹配的“无关变量”。有一个特殊的语法使用特殊的,否则是非法的,字段名_
。例如#record_name{record_field=something,_='_'}
。请注意,在您的示例中,您已经将元组中的 *record name元素 * 设置为'$1'。表示记录的元组始终将记录名称作为第一个元素。这意味着,当您创建ets表时,您应该将带有
{keypos,Pos}
的键位置设置为默认值1
以外的值,否则将不会有任何索引,如果您的表类型为'set'或'ordered_set',您将只获得表中的1个元素。要获得记录字段的索引,您可以使用语法#Record.Field
,在您的示例#record_name.record_field
中。xt0899hw2#
尝试使用
请参见此处了解解释。
omhiaaxx3#
您要查找的格式为#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创建记录)