當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


erlang select(Table, MatchSpec)用法及代碼示例


select(Table, MatchSpec) -> [Match]
類型:
Table = table()
MatchSpec = match_spec()
Match = term()

匹配表中的對象Table用一個匹配規格。這是一個比match/2match_object/2調用。最簡單的匹配規範如下:

MatchSpec = [MatchFunction]
MatchFunction = {MatchHead, [Guard], [Result]}
MatchHead = "Pattern as in ets:match"
Guard = {"Guardtest name", ...}
Result = "Term construct"

這意味著匹配規範始終是一個或多個元組(元數為 3)的列表。元組的第一個元素是一個模式,如中所述match/2。元組的第二個元素是 0 個或多個防護測試的列表(如下所述)。元組的第三個元素是一個列表,其中包含要返回的值的說明。在幾乎所有正常情況下,該列表隻包含一個術語,它完整地說明了每個對象返回的值。

返回值是使用MatchHead中綁定的"match variables"或使用特殊匹配變量'$_'(整個匹配對象)和'$$'(列表中的所有匹配變量)構造的,因此以下match/2表達:

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

完全等同於:

ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

以下match_object/2 調用:

ets:match_object(Table,{'$1','$2','$1'})

完全等於

ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

Result 部分中可以通過簡單地編寫一個列表來構造複合項,如下代碼:

ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

給出與以下相同的輸出:

ets:select(Table,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])

即,將匹配頭中的所有綁定變量作為列表。如果要構造元組,則必須編寫元數為 1 的元組,其中元組中的單個元素是要構造的元組(因為普通元組可能會被誤認為 Guard )。

因此以下調用:

ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

給出與以下相同的輸出:

ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

此語法等效於跟蹤模式中使用的語法(請參閱 dbg(3))Runtime_Tools 中的模塊。

Guard 被構造為元組,其中第一個元素是測試名稱,其餘元素是測試參數。要檢查綁定到匹配變量 '$1' 的元素的特定類型(例如列表),可以將測試編寫為 {is_list, '$1'} 。如果測試失敗,則表中的對象不匹配,並嘗試下一個MatchFunction(如果有)。 Erlang 中存在的大多數防護測試都可以使用,但隻允許前綴為 is_ 的新版本( is_floatis_atom 等)。

Guard 部分還可以包含邏輯和算術運算,它們的編寫語法與防護測試(前綴表示法)相同,因此用 Erlang 編寫的防護測試如下:

is_integer(X), is_integer(Y), X + Y < 4711

表達如下(X替換為'$1'Y替換為'$2'):

[{is_integer, '$1'}, {is_integer, '$2'}, {'<', {'+', '$1', '$2'}, 4711}]

對於 ordered_set 類型的表,對象的訪問順序與 first /next 遍曆中的順序相同。這意味著匹配規範針對具有 first /next 順序的鍵的對象執行,並且相應的結果列表按照該執行的順序。

相關用法


注:本文由純淨天空篩選整理自erlang.org大神的英文原創作品 select(Table, MatchSpec) -> [Match]。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。