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).
这个看上去不是很直观,但是在多个组合的调用下却是异常的好用!每一个函数都可以自定义下一要执行的函数。