[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 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种: ...
随机推荐
- SmallLocks
folly/SmallLocks.h This module is currently x64 only. This header defines two very small mutex types ...
- Spring boot with Apache Hive
5.29.1. Maven <dependency> <groupId>org.springframework.boot</groupId> <artif ...
- 无法定位程序输入点 Can't load package
---------------------------Toggle Form/Unit (F12): bcb.exe - 无法找到入口--------------------------- 无法定位程 ...
- AES 加密算法 跨语言
aes加密算法 delphi .java.c# .网页在线工具 4个相同 AES/ECB/PKCS5Padding 与网页在线工具加密结果相同 http://tool.chacuo.net/crypt ...
- php执行linux函数
function B(){ if(defined('LOCK') && LOCK == 'lock') return false; $addPort = sprintf('-A INP ...
- 13 MySQL--存储过程
1.存储过程的介绍 对于存储过程,可以接收参数,其参数有三类: in 仅用于传入参数用 out 仅用于返回值用 inout 既可以传入又可以当作返回值 存储过程包含了一系列可执行的sql语句,存储过程 ...
- 在Eclipse中创建Maven版的Web工程
步骤: 1.第一步 2.第二步 3.第三步 4.第四步 选中项目,右键在弹出的对话框中选择properties 5.第五步 6.第六步
- org.json库下的json的基本使用
public class Users { private String username; private String password; public String getUsername() { ...
- ubuntu server 安装nextcloud12
1.更新系统安装必要的依赖包 [user]$ sudo apt-get update && sudo apt-get -y upgrade [user]$ sudo apt-get i ...
- Linux文件权限查看及修改命令chmod,chown
查看权限 Linux文件访问权限分为可读,可写和可执行三种. 可用ls -l命令查看,例: ls -l或者 ll 显示为 -r--r--r--. 1 root root 21 Jan 5 23:02 ...