[Erlang28]使用匿名函数灵活组合不同的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             end
12     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             end
12     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) of
17         {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).

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

 

posted @ 2015-01-19 13:27  写着写着就懂了  阅读(955)  评论(0编辑  收藏  举报