9.函数

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

×

喜欢就点赞,疼爱就打赏