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


erlang foldl(Fun, Acc0, Archive)用法及代碼示例


foldl(Fun, Acc0, Archive) -> {ok, Acc1} | {error, Reason}
OTP R14B
類型:
Fun = fun((FileInArchive, GetInfo, GetBin, AccIn) -> AccOut)
FileInArchive = file:name()
GetInfo = fun(() -> file:file_info())
GetBin = fun(() -> binary())
Acc0 = Acc1 = AccIn = AccOut = term()
Archive = file:name() | {file:name(), binary()}
Reason = term()

AccIn == Acc0 開始,對 Archive 中的連續文件調用 Fun(FileInArchive, GetInfo, GetBin, AccIn)

FileInArchive 是文件在存檔中的名稱。

GetInfo 是一個返回有關文件信息的函數。

GetBin 返回文件內容。

GetInfoGetBin 都必須在 Fun 內調用。如果在 Fun 上下文之外調用它們,則它們的行為是未定義的。

Fun 必須返回一個新的累加器,該累加器將傳遞給下一個調用。 foldl/3 返回最終累加器值。如果存檔為空,則返回Acc0。沒有必要遍曆存檔中的所有文件。可以通過拋出異常以受控方式提前結束迭代。

例子:

> Name = "dummy.zip".
"dummy.zip"
> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]).
{ok,{"dummy.zip",
     <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
       0,0,3,0,0,...>>}}
> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}).
{ok,[{"bar",<<"BAR">>,
      {file_info,3,regular,read_write,
                 {{2010,3,1},{19,2,10}},
                 {{2010,3,1},{19,2,10}},
                 {{2010,3,1},{19,2,10}},
                 54,1,0,0,0,0,0}},
     {"foo",<<"FOO">>,
      {file_info,3,regular,read_write,
                 {{2010,3,1},{19,2,10}},
                 {{2010,3,1},{19,2,10}},
                 {{2010,3,1},{19,2,10}},
                 54,1,0,0,0,0,0}}]}
> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]).
{ok,{"dummy.zip",
     <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
       0,0,3,0,0,...>>}}
> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}). 
<<"FOO">>

相關用法


注:本文由純淨天空篩選整理自erlang.org大神的英文原創作品 foldl(Fun, Acc0, Archive) -> {ok, Acc1} | {error, Reason}。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。