[Erlang28]使用匿名函数灵活组合不同的case
cowboy_http.erl里面的date1/2 启示:
以前一般写case里都是这样子:
date1(Date) ->
case month1(Date) of
{error,badarg} ->
{error,badarg};
{ok,MonthData} ->
case timer1(MonthData) of
{error,badarg} ->
{error,badarg};
{ok,TimerData} ->
valid_date(TimerData)
end
end.
如果时间格式里month格式有3种(month1~month3) timer格式也有(timer1~timer3)
那么组合就有9种,要写成16个函数(date1~date9),最可怕的还是要为这9个函数取一个非常贴切的函数名,这简直无情啊!
所以我们仿照cowboy_http.erl里面匿名函数的写法:
date(Date,MonthFun,TimerFun,ValidFun) ->
case MonthFun(Date) of
{error,badarg} ->
{error,badarg};
{ok,MonthData} ->
case TimerFun(MonthData) of
{error,badarg} ->
{error,badarg};
{ok,TimerData} ->
ValidFun(TimerData)
end
end.
更进一步:假如我们现在只需要MonthFun 和TimerFun,不需要ValidFun函数,怎么办?
可以把month,timer,Valid都改写成date模式,让它更加灵活。
date(Date,MonthFun) ->
MonthFun(Date). month(MonthData,[]) ->
deal_month(MonthData);
month(MonthData,Fun) ->
case deal_month(MonthData) of
{error,badarg} ->
{error,badarg};
{ok,MonthData1} ->
Fun(MonthData1)
end.
timer(TimerData,[]) ->
deal_timer(TimerData);
timer(TimerData,Fun) ->
case deal_timer(TimerData) of
{error,badarg} ->
{error,badarg};
{ok,TimerData1} ->
Fun(TimerData1)
end.
调用如下:
date(Date,
fun(DateTemp) ->
month(DateTemp,
fun(Month1) ->
timer(Month1)
end)
end).
这个看上去不是很直观,但是在多个组合的调用下却是异常的好用!每一个函数都可以自定义下一要执行的函数。

[Erlang28]使用匿名函数灵活组合不同的case的更多相关文章
- 内置函数&匿名函数
1.内置函数 Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice ...
- python笔记4 内置函数,匿名函数.递归函数 面向对象(基础, 组合,继承)
内置函数 eval和exec eval :执行字符串中的代码并将结果返回给执行者,有返回值 exec:执行字符串中的代码,往往用于执行流程语句,没有返回值. s1 = '1+2' s2 = 'prin ...
- python语言(五)匿名函数、读写excel、操作数据库、加密、redis操作
一.匿名函数 递归:就是调用自己 def func(): num = int(input('num:')) if num % 2 ==0: print('是偶数') return else: func ...
- Python---12函数式编程------12.3匿名函数&装饰器&偏函数
一.匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时,除了定义一个f( ...
- Two---python循环语句/迭代器生成器/yield与return/自定义函数与匿名函数/参数传递
python基础02 条件控制 python条件语句是通过一条或多条语句的执行结果(Ture或者False)来执行的代码块 python中用elif代替了else if,所以if语句的关键字为:if- ...
- 巧用javascript对象属性,向事件绑定的匿名函数内传递循环控制变量的值
遇到一个需要向匿名函数传递循环控制变量的问题,我受到园子里这篇文章的启发[笔记]js获取当前点击元素的索引,解决了这个问题.现在把代码贴出来,以防止自己忘记. if ($('#labModal').l ...
- 一篇关于匿名函数(function(){})()不错的文章
代码如下: (function(){ //这里忽略jQuery所有实现 })(); (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他 ...
- Javascript闭包和C#匿名函数对比分析
C#中引入匿名函数,多少都是受到Javascript的闭包语法和面向函数编程语言的影响.人们发现,在表达式中直接编写函数代码是一种普遍存在的需求,这种语法将比那种必须在某个特定地方定义函数的方式灵活和 ...
- JavaScript中的匿名函数及函数的闭包
1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种: ...
随机推荐
- git grade 版本下载及安装
Git 2.11.1x64下载 gradle各版本下载地址 1. Git安装与配置 Gradle 用法总结
- python3调用阿里云语音服务
步骤 1 创建阿里云账号,包括语音服务里的企业实名 为了访问语音服务,您需要有一个阿里云账号.如果没有,可首先按照如下步骤创建阿里云账号: 访问阿里云 官方网站,单击页面上的 免费注册 按钮. 按照屏 ...
- Python/Java读取TXT文件
JAVA: public static void readTextFile(String filePath) { try { String encoding = "GBK"; Fi ...
- C#串口编程测试收发
原文:http://www.cnblogs.com/vsdot/archive/2013/04/23/3263348.html 基本传递方法:RS232传输要有1位起始位,8位数据位.1位校验位( ...
- jeesite快速开发平台(六)----代码生成模块介绍及使用
转自:https://blog.csdn.net/u011781521/article/details/79309861
- FDStoredProc 存储过程控件 强
//FireDAC FDStoredProc1->StoredProcName = "myReport1"; FDStoredProc1->Prepare(); FDS ...
- Navigation and Pathfinding
[Navigation and Pathfinding] 术语: 1)NavMesh 2)NavMesh Agent 3)Off-Mesh Link 4)NavMesh Obstacle A comm ...
- python之time&datetime
[time] secs:统一值,无local.UTC之分. struct_time:有local.UTC之分. time.time():返回secs,secs为统一值,无local&utc之分 ...
- CMD-SVN查看版本修改记录
[CMD-SVN查看版本修改记录] 问题:想查看某个版本的具体修做了哪些改动? 方法:svn diff -r r1:(r1-1) (filename) filename可选,如果加上就表示查看 ...
- 数据库 alert.log 日志中出现 "[Oracle][ODBC SQL Server Wire Protocol driver][SQL Server] 'RECOVER'"报错信息
现象描述: (1).数据库通过调用透明网络实现分布式事务,但透明网关停用后,失败的分布式事务并未清理. (2).数据库 alert 日志 Thu Sep 06 06:53:00 2018 Errors ...