函数 函数调用如果变量只有一个参数且参数是字符串或者表时可以省略(),其他必须要加() print "hello world" 函数的结构 function 函数名(参数列表) body:函数体 end 当调用函数的参数如果多余会被抛弃,不足则会用nil代替。 function f(a, b) print(a,b) end print(f()) --nil,nil print(f(1)) -- 1,nil print(f(1,2)) -- 1,2 print(f(1,2,3)) -- 1,2 函数的多返回值 s, e = string.find("hello lua users", "lua") print(s,e) 返回多个结果 return m,n 多重赋值中多返回值的特性 -- 注意 只有函数调用是表达式最后一个表达式才能返回多值结果,个数不够会用nil补充 function foo2() return "a","b" end x,y,z = 10,foo2() --x=10,y="a",z = "b" x,y,z = foo2() -- x = a, y = b, z = nil x,y = foo2(),10 -- x = a, y = 10, "b" 被抛弃 当一个函数的调用的结果是另外一个函数的唯一参数时,会接收所有返回值 print(foo2()) --如果它是不是唯一的实参,lua会把其返回值的个数调整为1,参数如果是固定的,lua则会把返回值的个数调整和参数一致 print(foo2(),1) --a, 1 print(foo2() .. "x") --ax 表构造器会完整的接收函数所有返回值的结果不会调整个数 t = {foo2()} -- "a","b" function foo1() return "a" end --上述只有函数调用时是唯一或者是最后一个才有效,在其他位置上总是只返回一个 t = {foo2(),foo1(),1} print(t[1],t[2],t[3]) -- a, a, 1 -- 在一个函数里return 另外一个函数的调用会返回所有值 function foo(i) if i == 1 then return foo1() else return foo2() end end -- 如果想强制返回一个结果 可以用一对圆括号 print((foo2())) 可变长参数 ... function add(...) local sum = 0 t = {...} for _, v in ipairs (t) do sum = sum +v end return sum end print(add(1,2,3,4,5,6,7,8,9)) -- 利用这个特性可以实现跟踪对某一个特定的函数 function foo1(...) print("calling foo:", ...) return foo(...) end 当可变长的参数是第二个参数,那么必然会先赋值给固定参数,将剩余的参数如果有 作为可变长的参数 function fwrite(fmt, ...) print( fmt) return io.write(string.format(fmt, ...)) end fwrite(0,1,3,"a") -- 遍历可变长参数可以用 {...},如果要判断它是否包含nil,可以用table.pack来处理 --table.pack将可变长参数变成一个数组 -- n代表可变长参数的个数 function nonils(...) local arg = table.pack(...) for i = 1, arg.n do if arg[i] == nil then return false end end return true end print(nonils(2,3,nil)) print(nonils(2,nil,2,4)) print(nonils(2,1,2,4)) 另外一种方式是函数 select,第一个参数是数值,则输出可变长参数是该数值后的所有的参数 如果是# 则输出返回参数个数的总和 print(select(1, "a", "b", "c")) -- a,b,c print(select(2, "a", "b", "c")) --b,c print(select(3, "a", "b", "c")) --c print(select("#", "a", "b", "c")) --3 --!这里select函数只会返回第i个参数,参考多返回值的特性 function add(...) local s = 0 for i = 1, select("#",...) do s = s+select(i,...) end return s end print(add(1,2,3)) table.unpack(t,i,n) t:数组, i:指定返回位置, n:返回的个数 返回值:长度 a,b,c =table.unpack{1,2,3} print(a,b,c) --1,2,3 尾调用 --尾调用是什么?尾调用(tail call)是指一个函数在执行的最后一步调用另一个函数。 --为什么要用尾调用:当一个函数在最后一步调用另一个函数时,Lua 的编译器可以优化掉当前函数的调用帧,直接使用被调用函数的调用帧,从而避免在调用栈上留下额外的信息。 function f(x) x = x+1; return g(x) end
Lua设计与程序第6章
最新推荐文章于 2024-08-20 10:32:13 发布