Lua函数进阶 - 上
1 参数的简化
-- 1: 函数参数的简化 function MyFunction() print("这是我的函数") end MyFunction() --带参函数 function SetName(str) print("请设置你的昵称: "..str) end --字符串形式参数 SetName("YJJ") SetName "魔教中人" --如果参数是字符串,则圆括号可以省略 --带参函数 function SetNameArray(nameArray) for i, v in ipairs(nameArray) do print(v) end end --Table形式参数调用 numArray = {1,2,34} SetNameArray(numArray) --简化形式调用,在比较清晰的时候再用,容易自己混淆 SetNameArray {5,6,7}
2 可变参数
--可变参数 function MultiPoVal(...) --表示可变参数 for i, v in pairs({...}) do print(v) end end --简化可变参数写法 --Lua有一个内置函数 arg 来代替 {...} 似乎高版本种,arg并不能用 function MultiPoVal(...) --表示可变参数 print("输入参数的个数: "..#arg) for i, v in pairs(arg) do print(v) end end --测试可变参数 MultiPoVal("东邪","西毒","北药师") --对于存在 'nil' 数值输入,如何进行可变参数函数的编写 --含义解释; --select("#",...)表示,返回可变参数长度 --select("i",...)表示,返回从索引数值到可变参数所有内容 function MultiPoVal(...) --表示可变参数 local num for i = 1, select('#',...) do num = select(i,...) print(num) end end MultiPoVal("东邪","西毒","北药师",nil,"JoJo")
3 标准函数库
--Lua语言的函数库 print(math.abs(-999)) --求绝对值 print(math.max(12,33,44)) --求最大值 print(math.min(12,33,4,22)) --求最小值 print(math.sin(0)) --求正玄值 print(math.cos(0)) --求余弦值 print(math.sqrt(36)) --求平方根 --随机数 print(math.randomseed(20000)) --随机因子,只有再随机因在发生巨大变化时,随机数才会改变 print(math.random(1,10)) --求随机数,有bug不好用 --字符串函数 print(string.lower("SSCSFSCG")) --得到小写 print(string.upper("jojo")) --得到大写 --还有很多不在赘述 --操作系统 print(os.date()) --得到当前时间 print(os.time()) --1970年至今的秒值 --结合系统时间,写一个随机数 function GetTrueRandom(min,max) local strTime = os.time(); --得到时间字符串 local strRev = string.reverse(strTime) --反转字符串 local strRandomTime = string.sub(strRev,1,6) math.randomseed(strRandomTime) --改变随机因子 print("随机数为: "..math.random(min,max)) --获取 1~200 的随机数 end --调用随机数程序 GetTrueRandom(1,100)
4 函数尾调用
-因为尾调用不占用 堆栈 空间, 所以不会出现 栈溢出. 所以尾调用起到了优化存储空间的作用
--函数尾调用 函数最后一行返回的是函数,则是尾调用 --什么是尾调用 --因为尾调用不占用 堆栈 空间, 所以不会出现 栈溢出. 所以尾调用起到了优化存储空间的作用 function FunA() --不是尾调用 local res = math.abs(-88) return res end function FunB() --不是尾调用 return FunA() end -- 递归算法,演示尾调用 function RecurFunc(num) if (num>1) then --return RecurFunc(num - 1) --是尾调用,正常执行 return RecurFunc(num - 1) + 0 --不是尾调用,造成栈溢出 else return "End !" end end res = RecurFunc(100) print(res)
--尾调用括号的作用 function FunC() print("Func") --return FunD() --返回多个数值 return (FunD()) --迫使返回一个数值 100,nil end function FunD() print("FinD") return 100,200 end res1,res2 = FunC() print(res1,res2)
5 函数的本质
--函数的本质 --eg1: 函数本质上是匿名的 function GetNum(num) return num*2 end GetNum2 = function(num) return num*3 end print(GetNum(10)) print(GetNum2(2)) --eg2: 函数可以存储在表中 funArray = {GetNum,GetNum2} --输出表中所有函数 for k, v in pairs(funArray) do print(funArray[k](20)) end --eg3: 函数的内容与表初始化同事进行 FuncList = {} FuncList.add = function(x,y) return x * y end FuncList.div = function(x,y) return x / y end print(FuncList.add(20,30)) print(FuncList.div(30,5))
--尾调用括号的作用function FunC() print("Func") --return FunD() --返回多个数值 return (FunD()) --迫使返回一个数值 100,nilend
function FunD() print("FinD") return 100,200end
res1,res2 = FunC()print(res1,res2)