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

本文介绍了一种在Erlang中使用高阶函数和匿名函数来简化复杂逻辑的方法,通过模仿cowboy_http.erl模块中的实现,展示了如何通过传递函数作为参数来减少重复代码并提高代码灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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).

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

 

转载于:https://www.cnblogs.com/zhongwencool/p/erlang_fun_use.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值