select(Table, MatchSpec) -> [Match]
Table = table()
MatchSpec = match_spec()
Match = term()
匹配表中的對象Table
用一個匹配規格。這是一個比match/2
和match_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_float
、 is_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 select(Tab, Spec)用法及代碼示例
- erlang select_replace(Table, MatchSpec)用法及代碼示例
- erlang select_reverse(Continuation)用法及代碼示例
- erlang self用法及代碼示例
- erlang setelement(Index, Tuple1, Value)用法及代碼示例
- erlang setopts(Socket, Options)用法及代碼示例
- erlang setopts(Opts)用法及代碼示例
- erlang send_request(Node, Module, Function, Args)用法及代碼示例
- erlang set_token(Token)用法及代碼示例
- erlang seq(From, To)用法及代碼示例
- erlang seed(A1, A2, A3)用法及代碼示例
- erlang sin用法及代碼示例
- erlang str用法及代碼示例
- erlang substr用法及代碼示例
- erlang sort用法及代碼示例
- erlang sublist用法及代碼示例
- erlang sum用法及代碼示例
- erlang split_binary用法及代碼示例
- erlang spawn用法及代碼示例
- erlang spawn on Node用法及代碼示例
- erlang spawnlink用法及代碼示例
- erlang safe_fixtable(Table, Fix)用法及代碼示例
- erlang split(Filename)用法及代碼示例
- erlang size(Item)用法及代碼示例
注:本文由純淨天空篩選整理自erlang.org大神的英文原創作品 select(Table, MatchSpec) -> [Match]。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。