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

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

     

  • 相关阅读:
    LUA 数据比较BUG?????是不是BUG大佬帮看看
    win10 优化批处理
    android Studio 二维码扫一扫 使用精简过的zxing
    AppCompatActivity 去除标题栏
    java 继承 重写 重载 super关键字
    java构造方法私有化
    java代码块的理解
    java 理解main方法
    java面向对象基础static
    docker 安装 nginx
  • 原文地址:https://www.cnblogs.com/zhongwencool/p/erlang_fun_use.html
Copyright © 2011-2022 走看看