3.1 lua 函数

通过前两章的学习大体掌握了lua的基本语法,这部分语法和其他语言大体类似,可以说这是一门语言语法的最最基础的部分了。在接下来的部分,将学习一下带有lua特性的语法知识。

返回值

通常一个函数会返回一个返回值,比如C/C++等,也有一些语言会返回多个返回值,比如python。lua也支持多返回值。以标准库中的string.find()函数为例,该函数会返回匹配字符串在搜索字符串中的起始位置索引,如果没匹配成功则返回nil

1
2
3
#!/usr/bin/bua
s, e = string.find("hello world", "he")
print(s, e)

对于返回值,lua有一个特性——尽可能的调整返回值的数量以适应调用环境,具体表现为一下规则:

  1. 当作为调用表达式最后一个参数或者仅有的一个参数时,根据变量的数量尽可能多的返回值,当变量数目大余于返回值数目时补nil,当变量数小于返回值数目时从左到右依此返回,舍弃右边多余的返回值。
  2. 其他情况下,函数只返回第一个返回值。
    总之,函数做作为最后一个参数时尽可能多返回返回值,其他情况只返回第一个返回值。
    上述规则同样适用于以下情况:
  3. 作为表达式赋值给其他变量
  4. 作为其他函数的参数
  5. 函数调用在表构造初始化时
  6. ruturn 参数
    函数调用用在表构造初始化时需要特别说明一下:
    1
    2
    3
    4
    5
    6
    7
    8
    function fun_0() end
    function fun_1() return "a" end
    function fun_2() return "b", "c" end

    a = {fun_0()} -- a = {}
    b = {fun_1()} -- b = {"a"}
    c = {fun_2()} -- c = {"b", "c"}
    d = {fun_0(), fun_1(), fun_2(), "d"} -- d = {nil, "a", "b", "d"}
    注意:如果return语句中将返回值用括号包裹起来也会导致返回一个值:
    1
    2
    function fun_3() return fun_2() end  -- "b", "c"
    function fun_4() return (fun_2()) end -- "b"

函数的定义

lua中函数是一等变量,可以通过关键字function来进行定义。

1
2
3
4
5
6
7
8
9
-- 和php等语言一样使用function关键字声明一个函数
local function func_a()
...
end

-- 在lua中函数也是一等变量,可以通过如下方式来声明一个函数
local func_b = function()
...
end

参数

和其他语言一样,在lua中,声明一个函数可以指定固定数目的参数,这些参数不需要指定类型。

1
2
3
local function a(a, b)
...
end

可变参数

同样,lua也支持可变参数,使用...来表示可变参数:

1
2
3
4
5
6
7
8
9
10
11
local function func_a(...)
for i, v in ipairs(args) do
print(v)
end
end
--5.3.4中已不支持arg表了,改用...代替,见programing in lua 4th pp45
local function func_b(...)
for i, v in ipairs(...) do
print(v)
end
end

有时,我们会遇到这样一种情况:既需要若干固定参数,但还需要可变参数。这时我们需要将固定参数列在参数列表的最左边,可变参数...放在最右边。

1
2
3
local function func_c(a, b, ...)
...
end

命名参数

和其他语言一样,lua的参数和位置是相关的,函数调用时,实参会按照位置依次传递给形参。但是,有时我们记不住形参的具体位置就有麻烦了。命名参数就很好的解决了这个问题。
但是,和c++等语言的命名参数不一样,lua的命名参数是通过table来实现的。