2011-09-29 48 views
8

我聽說通過代碼中的元組指定記錄是一種不好的做法:我應該始終使用記錄字段(#record_name{record_field = something})而不是簡單元組{record_name, value1, value2, something}如何匹配ets:匹配Erlang中的記錄?

但是,如何將記錄與ETS表匹配?如果我有記錄的表,我只能配合以下幾點:

ets:match(Table, {$1,$2,$3,something} 

很明顯,一旦我添加了一些新的領域,以記錄定義這種模式匹配將停止工作。

相反,我想用這樣的:

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

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

回答

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

您正在尋找
9

嘗試使用

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

this的說明。