Lua中文教程学习笔记 (5) 再论函数

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

闭包

在匿名函数内部的变量不是全局变量也不是局部变量,我们称作外部的局部变量(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)