如何匹配ets:match与Erlang中的记录?

svgewumm  于 2023-01-10  发布在  Erlang
关注(0)|答案(3)|浏览(271)

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

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

i7uaboj4

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中。

xt0899hw

xt0899hw2#

尝试使用

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

请参见此处了解解释。

omhiaaxx

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创建记录)

相关问题