返回首页 - Notes - 2011

Lua 函数


调用函数时必须带括号,除非其参数是一个字符串或一个 table 构造式,比如下面的情况就可以省略括号

调用函数时传递的参数个数可多可少,多的舍弃,少的赋 nil

如果一个函数调用不是一系列表达式的最后一个元素,则不管其返回多少个值,表达式都将只能接收到第一个返回值:
譬如,如果函数 func1() 返回值有两个,x, y = func1() 可以得到 x = 10y = 20,但对于表达式 x, y = func1(), 30 则只能得到 x = 10y = 30,第二个返回值 20 被丢弃

一个函数在调用另一个函数的情况下,如果被调函数是主调函数的最后一个实参时,被调函数的所有返回值都将作为实参传入主调函数。但如果被调函数处于一个表达式中,则主调函数只能接受到其第一个返回值,多余的将丢弃:
还是上面的 func1() 函数,对于 print(func1()) 将输出 10 20,而对于 print(func1() .. "abc") 则会输出 10abc

用一个 table 构造式可以完整地接收一个函数的所有返回值,形如:t = {func1()},相当于 t = {10, 20}

重要:很重要的一点,只要函数调用不是一个表达式最后的元素,则都将只能取到第一个返回值,余者丢弃

如果只想取函数的第一个返回值,则只需用一对小括号将函数调用括起来即可:如 print((func1())) 将输出 10,而不是 10 20

特别注意,Luareturn 语句不需要使用括号,这和 C 语言不同,因为在 Lua 中,小括号将起到截取第一个返回值的作用


变长参数

Lua 的函数定义中使用三个点 ... 来表示变长参数列表,函数里面的元素引用该变长参数列表时同样使用三个点

function foo(a, b, c) 其实相当于下面的语句

function foo(...)
    local a, b, c = ...
end

在使用变长参数的同时可以拥有任意数目的固定参数,但固定参数必须放在变长参数的前面

使用 select() 函数可以对变长参数列表进行指定性操作

  1. select('3', ...):返回变长数组第 3 个元素的值
  2. select('#', ...):返回变长数组的元素个数,包括值为 nil 的元素

高级特性

Lua 中,函数与变量没有本质的差异,函数既可以赋值给变量,也可以作为实参传递,还可以作为其他函数的返回值

Lua 中,函数支持嵌套,内函数可以访问外函数的变量

一个函数定义本质上只是一条赋值语句,这其实就是其他语言里的“匿名函数”。function foo(x) return 2*x end 相当于赋值语句:foo = function(x) return 2*x end


非全局函数

函数可以存放在表结构中,对应有三种声明方式

第一种

func = {}
func.foo = function(x, y) return x + y end
func.goo = function(x, y) return x - y end

第二种

func = {
    foo = function(x, y) return x + y end,
    goo = function(x, y) return x - y end,
}

第三种

func = {}
function func.foo(x, y) return x + y end
function func.goo(x, y) return x - y end

常用函数

tonumber():将目标值转化成数字,如果不能成功转化则返回值 nil

tostring():将目标值转化成字符串

table.maxn():返回目标 table 的最大正索引值

string.find():返回匹配字符串起始字符和结尾字符的索引值,譬如 a, b = string.find("Lua is good", "Lua")a 的值为 1b 的值为 3

unpack():接受一个数组作为参数,从下标 1 开始逐个返回元素值

io.write():输出文本;string.format():格式化文本;可以自定义一个函数合并这两函数

function fwrite(fmt, ...)
    return io.write(string.format(fmt, ...))
end

调用时可以使用形如 fwrite("%d %d\n", 4, 5) 的方式


date : 2011-10-01、2011-10-12