首页 > 代码库 > [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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。