我听说通过代码中的元组指定记录是一种不好的做法:我应该始终使用记录字段(#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})
不幸的是,它返回一个空列表。
答案 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)
答案 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创建记录)