若是为了更严格的使用局部变量,能够用do-end来界定一个块。即在do以后end以前组成一个做用域。数组
do local a = 10 ... end print( a ) -- nil
Lua中这个全局变量本质上也是一个table, 它把咱们建立的全局变量都保存在一个table里了。这个table名为_G。因此咱们能够这样返回全局变量:闭包
print( _G["myGlobal"] ) -- 这个全局名固然能够是其余类型 print( _G.myGlobal )
在多重返回值中,unpack,它接受一个数组为参数,它返回下标为1开始的全部元素。函数
local function Foo(a, b) print(a, b) end local tab = {1,2} Foo(unpack(tab)) -- 1,2
function add(...) local s = 0 for i, v in ipairs{...} do s = s + v end return s end print( add(2,3,3) ) -- 8
参数表三个点表示可接受不一样数量的实参。lua
function Add(options) if type(options.num1) ~= "number" or type(options.num2) ~= "number" then error("Add parameter are not number type") end print(options.num1, options.num2) end Add{num2=5,num1=4} -- 使用具名实参
foo = function (x) return 2*x end -- 匿名函数 -- 使用匿名函数增长便捷性 table.sort( network, function (a,b) return a.name > b.name end ) -- 用闭包实现一个计数函数 function newCounter() local iCount = 0 return function () iCount = iCount + 1 return iCount end end c1 = newCounter() print( c1() ) -- 1 print( c1() ) -- 2 c2 = newCounter() print( c2() ) -- 1 print( c1() ) -- 3 print( c2() ) -- 2 -- 闭包实现迭代器(更准确说是生成器) function next(t) local i = 0 return function () i = i + 1; return t[i] end end t = {1,2,10} iter = next(t) while true do local elem = iter() if elem == nil then break end print(elem) end tt = {10,11,13} for elem in next(tt) do print(elem) end
当一个函数调用另外一个函数的最后一个动做时,该调用就算是一条尾调用。code
尾调用不耗费任何栈空间,故在递归函数里使用尤现优点。递归
function f(x) return g(x) end -- 尾调用 -- 任何数字做为参数都不会形成栈溢出 function goo(n) if n > 0 then return goo(n-1) end end -- 如下都是不尾调用,只有符合“return <func>(<args>)”才算尾调用 function f(x) g(x) end return g(x) + 1 return g(x) or x return (g(x)) -- 这种复杂的算尾调用 return x[i].foo(x[j]+ a*b, i+j)
function func(x) x = x or 0 -- 可是要注意,若是参数用布尔值,不能这么用 end