Lua程序设计随笔(5)
深入函数
在Lua中,函数是作为第一类的对待的,即,可以存储到变量,可以作为返回值,可以作为函数的形参
事实上,在Lua中,函数都是匿名函数,所谓的函数名其实是持有这个函数的变量,
如
function foo(x)
return 2*x;
end
和
foo=function (x) return 2*x end
是等价的
closure 闭合函数
这个概念花了有点久的时间才弄清楚
闭合函数是指 一个函数之中的内部函数,使用了该函数的局部变量,那么这个局部变量的值不会随着内次调用而初始化
即 函数+局部变量+调用了局部变量的内部函数=闭合函数
例如
fuction addNumber()
local i=0; //局部变量
return funtion () //内部函数
i=i+1; //使用了局部变量
return i;
end;
end
adn=addNumber();
print(adn()) =>1
print(adn()) =>2
addNumber中的局部变量i并没有在每次调用的过程中重新置0;这种用法可以用于迭代器之中,或者一连串类似的但是变动不大的操作中
另外,当另外一个变量持有这个参数的时候,函数会赋予参数新的闭合函数
如
adn=addNumber();
adc=addNumber();
print(adn()) =>1
print(adc()) =>1
print(adn()) =>2
同时因为函数的第一类特性,可以用这种方式来给函数重新定义
例如
do
local oldSin=math.sin;
math.sin=funtion (x)
return oldSin(2*x)
end
end
先将旧的函数赋值给一个变量,然后使用新的实现方式来实现,那么这样就避免了直接调用旧的函数,必须通过新的函数来访问旧的函数,因为函数的调用本身是没有限制的,这个就可以创造一个限制的条件
以为函数的第一类特性,函数甚至可以做为table的元素
例如
tbl={}
tbl.foo=funtion (x,y) return x+y end
tbl.goo=funtion (x,y) return x*y end
或者
funtion tbl.foo(x,y) return x+y end
funtion tbl.goo (x,y) return x*y end
尾调用
function f() return g() end
当一个函数的返回值是另外一个函数时,且在调用结束后没有其他操作,那么这一操作不会耗费栈空间,即,不会存储尾函数的的空间,因为不会产生多余的空间,所以在使用递归的时候不用担心递归次数过多而导致栈溢出
Lua程序设计随笔(5)相关推荐
- Lua程序设计随笔(3)
符号[=]用于对左边的参数赋值,在等号右边的元素回先求职,然后赋值 所以 a[i],a[j]=a[j],a[i] 是可以直接交换的: 另外,[=]可以给多个元素赋值 如 a,b,c=1,2; a,b= ...
- 《lua程序设计(第二版)》学习笔记(五)-- 函数基础
-- 第 5 章 函数-- 一种对语句和表达式进行抽象的主要机制 print(os.date()); -- 打印日期 Sun Apr 20 12:44:46 2014 -- 一看到sun,感慨广州没有 ...
- lua transliterate实现(lua程序设计10.6练习10.3题)
lua transliterate实现(lua程序设计10.6练习10.3题) local function transliterate(s,t)return (string.gsub(s," ...
- lua split实现(lua程序设计10.6练习10.1题)
lua split实现(lua程序设计10.6练习10.1题) local function split(s,sp)local t = {}local last = 1local irepeati = ...
- 用空代理实现account(lua程序设计21.7练习21.4题)
用空代理实现account(lua程序设计21.7练习21.4题) function createAccount()local proxy = {}local mt = {balance = 0}mt ...
- 使用对偶表示重新实现Stack(lua程序设计21.7练习21.3题)
使用对偶表示重新实现Stack(lua程序设计21.7练习21.3题) local data = {} DualStack = {} function DualStack:new(o)o = o or ...
- lua实现继承(lua程序设计21.7 练习21.2题)
lua实现继承(lua程序设计21.7 练习21.2题) StackQueue = Stack:new() function StackQueue:insertBottom(v)table.inser ...
- lua实现stack(lua程序设计21.7 练习21.1题)
lua实现stack(lua程序设计21.7 练习21.1题) Stack = {} function Stack:new(o)o = o or {}self.__index = selfsetmet ...
- 【Aegisub相关】Lua程序设计 第4版(中文翻译)
[Aegisub相关]Lua程序设计 第4版(中文翻译) 链接:https://pan.baidu.com/s/1XiqiT9lLvnfGJfyrWQ87aA 提取码:ycxt 上述PDF原始来源:h ...
最新文章
- python 中的路径. ./ .. ../和相对路径的写法
- 关于mysql的update、delete、和insert into能否使用别名问题
- Mysql快照读和当前读
- kvm 调试内核方法
- jq往字符串中插入_jq: dom-插入
- 队列C++ | 用数组实现队列_1
- 论文密级_2019年毕业研究生论文提交的通知
- 多个需要验证的输入框思路问题
- 计算机网络超详细笔记(五):网络层
- 算法设计与分析第六章习题解答与学习指导(第2版)屈婉婷 刘田 张立昂 王捍贫编著 清华大学出版社
- 网易云音乐,如何修改文件品质为320Kbps
- PC端模拟微信/QQ/钉钉运行环境 解决 请在微信客户端打开链接 解决 2021
- IEEE邮件爆出:禁止华为员工审稿,惨遭网友吐槽!
- 转:[IDEA]Java:“程序包XXX不存在”问题的三种解决方案
- MATLAB调用DLL
- 基于西门子S7-1200PLC的步进电机控制
- 底层放弃教育,中产过度焦虑,上层不玩中国高考
- 解决VS在Release下编译程序报“应用程序无法启动,应用程序的并行配置不正确”的问题
- ajax里数组添加数据,小笔记(一):ajax传递数组及将ajax返回数据赋值
- STM32彩灯控制器
热门文章
- 【布局优化】基于Memetic算法求解集群无线传感器网络中节能覆盖控制优化问题含Matlab源码
- 5G,上天了!卫星和基站擦出了火花?
- 图片无缝拼接 html,snapseed如何无缝拼接图片
- Spring Cloud Gateway 自定义网络响应状态码(401,500,503等等)
- 福大软工1816 · 第六次作业 - 团队选题报告
- UI设计师为什么要学习字体设计?
- excel表格锁定怎么解锁_让用户锁定或解锁Excel工作簿
- Python卸载旧版本并安装新版本
- P4语言——basic_tunnel
- SQL入门-连结(JOIN)