zoukankan      html  css  js  c++  java
  • [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).

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

     

  • 相关阅读:
    搭建企业级Docker Registry -- Harbor
    搭建私服-docker registry
    CentOS 7.2修改网卡名称
    tomcat错误日志监控脚本
    Openresty+Lua+Redis灰度发布
    Jenkins权限控制-Role Strategy Plugin插件使用
    Rsyslog日志服务搭建
    awk4.0对数组value排序
    Spring-IOC 在非 web 环境下优雅关闭容器
    Spring-IOC bean 生命周期之 Lifecycle 钩子
  • 原文地址:https://www.cnblogs.com/zhongwencool/p/erlang_fun_use.html
Copyright © 2011-2022 走看看