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

时间:2011-09-29 08:50:33

标签: erlang tuples record ets

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

答案 0 :(得分: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之外的其他值,否则将不会有任何索引,如果您有类型的表,则会更糟设置'或'ordered_set'你只能得到表中的1个元素。要获取记录字段的索引,您可以在示例#Record.Field中使用语法#record_name.record_field

答案 1 :(得分:9)

尝试使用

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

请参阅this了解相关信息。

答案 2 :(得分:4)

您正在寻找的格式是#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创建记录)