函数可以看作程序员定义的操作,每个函数都会实现一系列的计算,然后(大多数时候)生成一个计算结果.
★ 必须先创建后使用!
函数体是一个语句块,定义了函数的具体操作.在函数体中可以定义只在该函数中有效的变量(局部变量).
当执行到end语句的时候,函数调用结束.可以通过return语句返回一个指定的结果值.执行return语句后,被挂起的主程序在调用处恢复执行,继续处理其他的工作.
function func_name (arguments-list)
statements-list;
end;
在Lua中,函数可以一次返回多个返回值.
function f()
return 1,2
end
a, b = f()
f()返回两个值,第一个赋给a,第二个赋给b。
function f(a, b) return a or b
end
print(f(3))
print(f(nil,4))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
闭包
当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征我们称作词法定界。很少语言提供这种支持。
非全局函数
Lua 中函数可以作为全局变量也可以作为局部变量
- 函数作为table域
函数作为 table 的域(大部分 Lua 标准库使用这种机制来实现的比如 io.read、math.sin) 。这种情况下,必须注意函数和表语法:
表和函数放在一起
使用表构造函数
第三种方式
Lib = {}
function Lib.foo (x,y)
return x + y
end
function Lib.goo (x,y)
return x - y
end - 局部函数
方式一
local f = function (...)
...
end
local g = function (...)
...
f() -- external local `f' is visible here
...
end
示例
function a()
local b = function () print("xx") end;
local c = function () b() end;
c()
end
有一点需要注意的是在声明递归局部函数的方式:
local fact = function (n)
if n == 0 then
return 1
else
return n*fact(n-1) -- buggy
end
end
上面这种方式导致 Lua 编译时遇到 fact(n-1)并不知道他是局部函数 fact, Lua 会去查找是否有这样的全局函数 fact。为了解决这个问题我们必须在定义函数以前先声明:
local fact
fact = function (n)
if n == 0 then
return 1
else
return n*fact(n-1)
end
end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
方式二
local function f (...)
...
end
示例
function x()
local function test()
print("hello world");
end
test()
end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13