print("******* Function ******* ")
-- function 函数名()
-- end
-- 或者
-- a = function()
-- end
-- print("******* 无参数无返回值 ******* ")
function F1()
print("F1 function")
end
F1()
-- 有点类似C#中的委托和事件
F2 = function ()
print("F2 function")
end
F2()
-- print("******* 有参数 ******* ")
function F3(a)
-- print("params:" .. a)
print(a)
end
F3(1)
F3("1234")
F3(true) -- boolean类型不能做拼接操作
-- 如果传入的参数和函数参数不匹配
-- 不会报错,会补空nil 或者 截断(丢弃)后面的参数
F3() -- 会返回nil, 空类型也不能进行拼接操作
F3(1,2,3)
-- print("******* 有返回值 ******* ")
function F4(a)
return a
end
temp = F4("1234")
print(temp)
-- 返回多返回值
function F4(a)
return a, "123", true
end
temp = F4(3) -- 后面多余的返回值会被截断丢弃
print(temp)
-- 在前面声明多个变量来接取
temp1, temp2, temp3 = F4(3)
print(temp1)
print(temp2)
print(temp3)
-- 如果接取的变量多了,直接赋值为nil
temp1, temp2, temp3, temp4 = F4(3)
print(temp1)
print(temp2)
print(temp3)
print(temp4)
-- print("******* 函数的类型 ******* ")
-- 函数的类型就是function
F5 = function ()
print("123")
end
print(type(F5))
-- print("******* 函数的重载 ******* ")
-- 函数名相同, 参数类型不同, 或者参数个数不同
function F6()
print("F5") ''
end
function F6(str)
print(str)
end
-- Lua不支持重载,只会默认调用最后声明的函数
-- F6() -- 返回 nil
F6("STR")
-- print("******* 变长参数 ******* ")
function F7(...)
arg = {...}
for i = 1, #arg do
print(arg[i])
end
end
F7(1,2,4,5,6,7)
F7(1,2,"3",true);
-- print("******* 函数嵌套 ******* ")
function F8()
--[[
F9 = function ()
print("In F9")
end
return F9
]]
return function ()
print("In F9")
end
end
f9 = F8()
f9()
-- 在Lua中闭包的体现是什么? 即 函数嵌套
-- 在函数里面返回一个函数,改变函数里变量的生命周期
function F9(x)
-- 改变了传入参数x的生命周期
return function (y)
return x + y
end
end
f10 = F9(10) -- 传入参数x,通常来说F9()函数执行完后参数x生命周期即结束,但是现在函数中的嵌套改变了x的生命周期
print(f10(5)) -- 传入参数y,此时x依然有效
但是要注意在Lua中没有递归的概念!!!!如果在函数中调用另一个函数,那么被调用的函数执行完成后不会返回调用函数的地址,因此没有栈的概念,可以无限迭代下去
a = function(n)
if n > 0 then
print("in if " .. n)
return a(n-1)
end
n = n + 2
print("out if " .. n)
end
a(4)
在上面这个例子中,只有在 【n == 0】 的时候才会执行 【n = n + 2】,n = 4, 3, 2, 1执行的时候不会执行【if】之后的语句