9.函数
9.1 知识点
函数的基本语法
命名函数语法
- 声明:
function 函数名() -- 函数体 end
- 调用:
函数名()
匿名函数语法
- 声明:
装载函数的变量 = function() -- 函数体 end
- 调用:
装载函数的变量()
无参数无返回值的函数
命名的无参数无返回值的函数
-- 命名的无参数无返回值的函数
-- F1()--不能再未声明函数前调用函数 否则报错
function F1()
print("我是命名的无参数无返回值的函数F1")
end
F1() --我是命名的无参数无返回值的函数F1
匿名的无参数无返回值的函数
-- 匿名的无参数无返回值的函数
F2 = function()
print("我是匿名的无参数无返回值的函数F2")
end
--用F2装载了函数 有点类似C#中的委托和事件
F2() --我是匿名的无参数无返回值的函数F2
有参数的函数
- 有参数的函数在函数的括号中写入参数,不需要声明类型
function F3(a)
print("我是有参数的函数F3")
print(a)
-- print(string.format("参数是%s", a)) -- 注意占位符 %s 的位置 假如传进来的参数是true或者nil进行字符串拼接会报错
end
--有参数的函数在函数的括号中传入参数进行调用
F3(1) --1
F3("123") --123
F3(true) --true 假如函数中有字符串拼接的逻辑会报错
--如果传入的参数和函数参数个数不匹配
--不会报错 只会补空nil 或者 丢弃
F3() --nil 假如函数中有字符串拼接的逻辑会报错
F3(nil) --nil 假如函数中有字符串拼接的逻辑会报错
F3(1, 2, 3) --1 丢弃了后面两个参数
有返回值的函数
单返回值的函数
--单返回值的函数
--在函数体使用return返回变量
function F4(a)
print("我是单返回值的函数F4")
return a
end
--用一个变量接返回值
temp = F4(1)
print(temp) --1
多返回值的函数
--多返回值的函数
--在函数体使用return返回多个变量,变量间用逗号隔开
function F5(a)
print("我是多返回值的函数F5")
return a, "123", true
end
--用多个变量来接多个返回值 值接对应位置的返回值
--如果变量不够不会报错 变量仍然接对应位置的返回值
--如果变量多了不会报错 多出来的变量会被赋值nil
temp1, temp2, temp3, temp4 = F5("1")
print(temp1) --1
print(temp2) --123
print(temp3) --true
print(temp4) --nil
函数的类型
- 装载函数的变量的变量类型是function
F6 = function()
print("我是被查看函数类型的函数F6")
end
--使用type方法查看装载函数的变量的变量类型
print(type(F6)) --function
函数的重载
- lua中的函数不支持重载
- 同名函数会被最后一个声明的同名函数顶掉,调用时默认调用最后一个声明的同名函数
--无参函数
function F7()
print("我是无参函数F7")
end
--有参函数 已经把无参函数顶掉了
function F7(str)
print("我是有参函数F7")
print(str)
end
--尝试不传参数调用无参函数 但是无参函数被有参函数顶掉 调用的是有参函数
F7() --我是有参函数F7 nil
变长参数
- 在函数的括号中写入…
function F8(...)
-- 变长参数使用用一个表存起来
arg = { ... }
-- #arg可以得到变长参数表的长度
print("我是变成参数F8,参数的长度是" .. #arg .. " 传进来的参数如下")
-- 再对表进行遍历输出
for i = 1, #arg do
print(arg[i])
end
end
F8(1, "123", true, 4, 5, 6) -- 1 "123" true 4 5 6
函数嵌套
- 函数的返回值是函数类型的变量
函数返回命名函数
--函数返回命名函数
function F9()
F99 = function()
print("我是F9函数内嵌套并返回出去的函数F99");
end
return F99
end
f9 = F9() --F9()调用后会返回一个函数 用f9作为装载函数的变量去接
f9() --我是F9函数内嵌套并返回出去的函数F99
函数返回匿名函数
--函数返回匿名函数
function F10()
return function()
print("我是F10函数内嵌套并返回出去的匿名函数");
end
end
f10 = F10() --F10()调用后会返回一个函数 用f10作为装载函数的变量去接
f10() --我是F10函数内嵌套并返回出去的匿名函数
闭包
--闭包
function F11(x)
--内部函数捕获外部函数的局部变量x,并可以在外部函数结束后继续使用它
--改变了传入参数x的生命周期
return function(y)
return x + y
end
end
f11 = F11(10)
--F11(10)会返回一个函数给f11装载
--f11装载的其实是如下这个函数
-- function f11(y)
-- return 10 + y
-- end
print(f11(5)) --15 因为10+5
9.2 知识点代码
print("**********函数************")
print("**********知识点一 函数的基本语法************")
--命名函数语法:
--声明:
--function 函数名()
-- 函数体
--end
--调用:
-- 函数名()
--匿名函数语法:
--声明:
-- 装载函数的变量 = function()
-- 函数体
-- end
--调用:
-- 装载函数的变量()
print("**********知识点二 无参数无返回值的函数************")
-- 命名的无参数无返回值的函数
-- F1()--不能再未声明函数前调用函数 否则报错
function F1()
print("我是命名的无参数无返回值的函数F1")
end
F1() --我是命名的无参数无返回值的函数F1
-- 匿名的无参数无返回值的函数
F2 = function()
print("我是匿名的无参数无返回值的函数F2")
end
--用F2装载了函数 有点类似C#中的委托和事件
F2() --我是匿名的无参数无返回值的函数F2
print("**********知识点三 有参数的函数************")
--有参数的函数在函数的括号中写入参数 不需要声明类型
function F3(a)
print("我是有参数的函数F3")
print(a)
-- print(string.format("参数是%s", a)) -- 注意占位符 %s 的位置 假如传进来的参数是true或者nil进行字符串拼接会报错
end
--有参数的函数在函数的括号中传入参数进行调用
F3(1) --1
F3("123") --123
F3(true) --true 假如函数中有字符串拼接的逻辑会报错
--如果传入的参数和函数参数个数不匹配
--不会报错 只会补空nil 或者 丢弃
F3() --nil 假如函数中有字符串拼接的逻辑会报错
F3(nil) --nil 假如函数中有字符串拼接的逻辑会报错
F3(1, 2, 3) --1 丢弃了后面两个参数
print("**********知识点四 有返回值的函数************")
--单返回值的函数
--在函数体使用return返回变量
function F4(a)
print("我是单返回值的函数F4")
return a
end
--用一个变量接返回值
temp = F4(1)
print(temp) --1
--多返回值的函数
--在函数体使用return返回多个变量,变量间用逗号隔开
function F5(a)
print("我是多返回值的函数F5")
return a, "123", true
end
--用多个变量来接多个返回值 值接对应位置的返回值
--如果变量不够不会报错 变量仍然接对应位置的返回值
--如果变量多了不会报错 多出来的变量会被赋值nil
temp1, temp2, temp3, temp4 = F5("1")
print(temp1) --1
print(temp2) --123
print(temp3) --true
print(temp4) --nil
print("**********知识点五 函数的类型************")
-- 装载函数的变量的变量类型是function
F6 = function()
print("我是被查看函数类型的函数F6")
end
--使用type方法查看装载函数的变量的变量类型
print(type(F6)) --function
print("**********知识点六 函数的重载************")
--lua中的函数不支持重载
--同名函数会被最后一个声明的同名函数顶掉 调用时默认调用最后一个声明的同名函数
--无参函数
function F7()
print("我是无参函数F7")
end
--有参函数 已经把无参函数顶掉了
function F7(str)
print("我是有参函数F7")
print(str)
end
--尝试不传参数调用无参函数 但是无参函数被有参函数顶掉 调用的是有参函数
F7() --我是有参函数F7 nil
print("**********知识点七 变长参数************")
-- 在函数的括号中写入...
function F8(...)
--变长参数使用用一个表存起来
arg = { ... }
--#arg可以得到变长参数表的长度
print("我是变成参数F8,参数的长度是" .. #arg .. " 传进来的参数如下")
-- 再对表进行遍历输出
for i = 1, #arg do
print(arg[i])
end
end
F8(1, "123", true, 4, 5, 6) --1 "123" true 4 5 6
print("**********知识点八 函数嵌套************")
--函数的返回值是函数类型的变量
--函数返回命名函数
function F9()
F99 = function()
print("我是F9函数内嵌套并返回出去的函数F99");
end
return F99
end
f9 = F9() --F9()调用后会返回一个函数 用f9作为装载函数的变量去接
f9() --我是F9函数内嵌套并返回出去的函数F99
--函数返回匿名函数
function F10()
return function()
print("我是F10函数内嵌套并返回出去的匿名函数");
end
end
f10 = F10() --F10()调用后会返回一个函数 用f10作为装载函数的变量去接
f10() --我是F10函数内嵌套并返回出去的匿名函数
--闭包
function F11(x)
--内部函数捕获外部函数的局部变量x,并可以在外部函数结束后继续使用它
--改变了传入参数x的生命周期
return function(y)
return x + y
end
end
f11 = F11(10)
--F11(10)会返回一个函数给f11装载
--f11装载的其实是如下这个函数
-- function f11(y)
-- return 10 + y
-- end
print(f11(5)) --15 因为10+5
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com