我听说在代码中通过元组指定记录是一个坏习惯:我应该始终使用记录字段(#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})
不幸的是,它返回一个空列表。
最佳答案
问题的原因是在执行#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
。
关于erlang - 如何匹配ets :match against a record in Erlang?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7594738/