深入函数

在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)相关推荐

  1. Lua程序设计随笔(3)

    符号[=]用于对左边的参数赋值,在等号右边的元素回先求职,然后赋值 所以 a[i],a[j]=a[j],a[i] 是可以直接交换的: 另外,[=]可以给多个元素赋值 如 a,b,c=1,2; a,b= ...

  2. 《lua程序设计(第二版)》学习笔记(五)-- 函数基础

    -- 第 5 章 函数-- 一种对语句和表达式进行抽象的主要机制 print(os.date()); -- 打印日期 Sun Apr 20 12:44:46 2014 -- 一看到sun,感慨广州没有 ...

  3. lua transliterate实现(lua程序设计10.6练习10.3题)

    lua transliterate实现(lua程序设计10.6练习10.3题) local function transliterate(s,t)return (string.gsub(s," ...

  4. 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 = ...

  5. 用空代理实现account(lua程序设计21.7练习21.4题)

    用空代理实现account(lua程序设计21.7练习21.4题) function createAccount()local proxy = {}local mt = {balance = 0}mt ...

  6. 使用对偶表示重新实现Stack(lua程序设计21.7练习21.3题)

    使用对偶表示重新实现Stack(lua程序设计21.7练习21.3题) local data = {} DualStack = {} function DualStack:new(o)o = o or ...

  7. lua实现继承(lua程序设计21.7 练习21.2题)

    lua实现继承(lua程序设计21.7 练习21.2题) StackQueue = Stack:new() function StackQueue:insertBottom(v)table.inser ...

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

  9. 【Aegisub相关】Lua程序设计 第4版(中文翻译)

    [Aegisub相关]Lua程序设计 第4版(中文翻译) 链接:https://pan.baidu.com/s/1XiqiT9lLvnfGJfyrWQ87aA 提取码:ycxt 上述PDF原始来源:h ...

最新文章

  1. python 中的路径. ./ .. ../和相对路径的写法
  2. 关于mysql的update、delete、和insert into能否使用别名问题
  3. Mysql快照读和当前读
  4. kvm 调试内核方法
  5. jq往字符串中插入_jq: dom-插入
  6. 队列C++ | 用数组实现队列_1
  7. 论文密级_2019年毕业研究生论文提交的通知
  8. 多个需要验证的输入框思路问题
  9. 计算机网络超详细笔记(五):网络层
  10. 算法设计与分析第六章习题解答与学习指导(第2版)屈婉婷 刘田 张立昂 王捍贫编著 清华大学出版社
  11. 网易云音乐,如何修改文件品质为320Kbps
  12. PC端模拟微信/QQ/钉钉运行环境 解决 请在微信客户端打开链接 解决 2021
  13. IEEE邮件爆出:禁止华为员工审稿,惨遭网友吐槽!
  14. 转:[IDEA]Java:“程序包XXX不存在”问题的三种解决方案
  15. MATLAB调用DLL
  16. 基于西门子S7-1200PLC的步进电机控制
  17. 底层放弃教育,中产过度焦虑,上层不玩中国高考
  18. 解决VS在Release下编译程序报“应用程序无法启动,应用程序的并行配置不正确”的问题
  19. ajax里数组添加数据,小笔记(一):ajax传递数组及将ajax返回数据赋值
  20. STM32彩灯控制器

热门文章

  1. 【布局优化】基于Memetic算法求解集群无线传感器网络中节能覆盖控制优化问题含Matlab源码
  2. 5G,上天了!卫星和基站擦出了火花?
  3. 图片无缝拼接 html,snapseed如何无缝拼接图片
  4. Spring Cloud Gateway 自定义网络响应状态码(401,500,503等等)
  5. 福大软工1816 · 第六次作业 - 团队选题报告
  6. UI设计师为什么要学习字体设计?
  7. excel表格锁定怎么解锁_让用户锁定或解锁Excel工作簿
  8. Python卸载旧版本并安装新版本
  9. P4语言——basic_tunnel
  10. SQL入门-连结(JOIN)