ska*_*tek 8 erlang tuples record ets
我听说通过代码中的元组指定记录是一种不好的做法:我应该总是使用记录字段(#record_name{record_field = something})而不是普通元组{record_name, value1, value2, something}.
但是如何将记录与ETS表匹配?如果我有一个包含记录的表,我只能匹配以下内容:
ets:match(Table, {$1,$2,$3,something}
Run Code Online (Sandbox Code Playgroud)
很明显,一旦我在记录定义中添加了一些新字段,这种模式匹配就会停止工作.
相反,我想使用这样的东西:
ets:match(Table, #record_name{record_field=something})
Run Code Online (Sandbox Code Playgroud)
不幸的是,它返回一个空列表.
rvi*_*ing 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.
尝试使用
ets:match(Table, #record_name{record_field=something, _='_'})
Run Code Online (Sandbox Code Playgroud)
请参阅此说明.