Lua中文教程学习笔记 (5) 再论函数
2016-08-23 10:47
375 查看
Lua中文教程学习笔记 (5) 再论函数
Lua 中的函数是带有词法定界(lexical scoping)的第一类值(first-class values)。第一类值指:在 Lua 中函数和其他值(数值、字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值。词法定界指:被嵌套的函数可以访问他外部函数中的变量。这一特性给 Lua 提供了强大的编程能力
根据table中的元素的某个属性来给table排序
local mytable = { {a = 15 , b = 32 }, {a = 2 , b = 32 }, {a = 5 , b = 32 }, {a = 4 , b = 32 }, } local function mysortBya(t1,t2) return t1.a<t2.a end table.sort(mytable)
闭包
在匿名函数内部的变量不是全局变量也不是局部变量,我们称作外部的局部变量(external local variable)或者 upvalue(感觉有点类似C++中的静态局部变量,但又不完全一样)
我们看一段代码
function newCounter() local i = 0 return function() -- anonymous function i = i + 1 return i end end c1 = newCounter() print(c1()) --> 1 print(c1()) --> 2 c2 = newCounter() print(c2()) --> 1 print(c1()) --> 3 print(c2()) --> 2
c1、c2 是建立在同一个函数上,但作用在同一个局部变量的不同实例上的两个不同的闭包
个人感觉c1和c2是newCounter的两个实例(或者说c1和c2是两个全新的函数只不过实现都是newCounter),所以每次调用c1或c2的时候,外部的局部变量i分别有自己的计数
非全局函数
表和函数放在一起
Lib = {} Lib.foo = function (x,y) return x + y end Lib.goo = function (x,y) return x - y end
使用表构造函数
Lib = { foo = function (x,y) return x + y end, goo = function (x,y) return x - y end }
Lua 提供另一种语法方式
Lib = {} function Lib.foo (x,y) return x + y end function Lib.goo (x,y) return x - y end
当我们将函数保存在一个局部变量内时,我们得到一个局部函数,也就是说局部函数像局部变量一样在一定范围内有效。这种定义在包中是非常有用的:因为 Lua 把 chunk当作函数处理,在 chunk 内可以声明局部函数(仅仅在 chunk 内可见),词法定界保证了包内的其他函数可以调用此函数。下面是声明局部函数的两种方式:
方式一
local f = function (...) ... end local g = function (...) ... f() -- external local `f' is visible here ... end
方式二
local function f (...) ... end
正确的尾调用
尾调用是一种类似在函数结尾的 goto 调用,当函数最后一个动作是调用另外一个函数时,我们称这种调用尾调用function f(x) return g(x) end
由于尾调用不需要使用栈空间,那么尾调用递归的层次可以无限制的。例如下面调用不论 n 为何值不会导致栈溢出(C++中会压栈n次)
function foo (n) if n > 0 then return foo(n - 1) end end
以下几种形式不是真正的尾递归
function f (x) g(x) return --丢弃 g 的返回值 end return g(x) + 1 -- must do the addition return x or g(x) -- must adjust to 1 result return (g(x)) -- must adjust to 1 result
相关文章推荐
- Lua中文教程学习笔记 (3)基本语法
- Lua中文教程学习笔记 (1) 类型和值
- Lua中文教程学习笔记 (4) 函数
- Lua中文教程学习笔记 (2) 表达式
- thymeleaf 学习笔记-基础篇(中文教程)
- CUBRID学习笔记 29 web管理中文语言文件 CUBRID教程
- thymeleaf 学习笔记-基础篇(中文教程)
- thymeleaf 学习笔记-基础篇(中文教程)
- thymeleaf 学习笔记-基础篇(中文教程)
- Unity官方游戏实例视频中文教程之太空射击学习笔记
- thymeleaf 学习笔记-基础篇(中文教程)
- thymeleaf 学习笔记-基础篇(中文教程)
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
- Lua基础教程之表(Table)学习笔记
- thymeleaf 学习笔记-基础篇(中文教程)
- Thymeleaf 学习笔记-实例demo(中文教程)
- 【maven学习笔记】maven基础入门学习中文教程
- Thymeleaf 学习笔记-实例demo(中文教程)
- Java中文处理学习笔记——Hello Unicode
- Java的中文处理学习笔记:Hello Unicode