首页 > 代码库 > [Erlang_Question28]使用匿名函数灵活组合不同的case

[Erlang_Question28]使用匿名函数灵活组合不同的case

cowboy_http.erl里面的date1/2  启示:

以前一般写case里都是这样子:

 1 date1(Date) -> 2     case month1(Date) of 3         {error,badarg} -> 4             {error,badarg}; 5         {ok,MonthData} -> 6             case timer1(MonthData) of 7                 {error,badarg} -> 8                     {error,badarg}; 9                 {ok,TimerData} ->10                     valid_date(TimerData)11             end12     end.

 如果时间格式里month格式有3种(month1~month3) timer格式也有(timer1~timer3)
 那么组合就有9种,要写成16个函数(date1~date9),最可怕的还是要为这9个函数取一个非常贴切的函数名,这简直无情啊!
 所以我们仿照cowboy_http.erl里面匿名函数的写法:

 1 date(Date,MonthFun,TimerFun,ValidFun) -> 2     case MonthFun(Date) of 3         {error,badarg} -> 4             {error,badarg}; 5         {ok,MonthData} -> 6             case TimerFun(MonthData) of 7                 {error,badarg} -> 8                     {error,badarg}; 9                 {ok,TimerData} ->10                     ValidFun(TimerData)11             end12     end.

 更进一步:假如我们现在只需要MonthFun 和TimerFun,不需要ValidFun函数,怎么办?
 可以把month,timer,Valid都改写成date模式,让它更加灵活。

 1 date(Date,MonthFun) -> 2     MonthFun(Date). 3  4 month(MonthData,[]) -> 5     deal_month(MonthData); 6 month(MonthData,Fun) -> 7     case deal_month(MonthData) of 8         {error,badarg} -> 9             {error,badarg};10         {ok,MonthData1} ->11             Fun(MonthData1)12     end.13 timer(TimerData,[]) ->14     deal_timer(TimerData);15 timer(TimerData,Fun) ->16     case deal_timer(TimerData) of17         {error,badarg} ->18             {error,badarg};19         {ok,TimerData1} ->20             Fun(TimerData1)21     end.

调用如下:

1 date(Date,2     fun(DateTemp) ->3         month(DateTemp,4             fun(Month1) ->5                 timer(Month1)6             end)7     end).

这个看上去不是很直观,但是在多个组合的调用下却是异常的好用!每一个函数都可以自定义下一要执行的函数。

 技术分享

[Erlang_Question28]使用匿名函数灵活组合不同的case