L1[function]01. 定义与调用函数

函数的定义 和概念 没什么可说的

lua的函数声明和调用是有先后顺序的  先声明后调用

函数就是变量的一种 所以可以自由的把函数在变量间相互赋值 不过注意函数变量和表变量差不多 都是存储的是内存地址 指针

aa=function (x,y)—红色部分就是所谓的lua的匿名函数 但是真的名不副实
     print(x,y)
end
aa(1,2
)


L1[function]02. 作用域与返回值

L1[function]03. 多个返回值

function test(x,y,z)
     return x+1,y+1,z+1--懒得说
end
a,b,c=test(1,2,3)
print(a,b,c)

小知识:return在函数内得一点注意事项 return在函数内 一般都是函数代码得最后一行(空行 end之类自然不算) 如果强行在return语句后面加上其他代码 很大可能会导致报错



function test(x,y,z)
    return x+1,y+1,z+1
    print("1")--直接报错 D:\Program Files (x86)\zerobrane\bin\lua53.exe: E:\lua\test15.lua:3: 'end' expected (to close 'function' at line 1) near 'print'
end
a,b,c=test(1,2,3)
print(a,b,c)



但是 有些代码写在return后面没事 不过就几个 else  elseif end    ..



function test1(a,b)
    
    if (a>b) then
        return "大于"
    elseif (a==b) then
        return "等于"
    else
        --肯定是a<b
        return "小于"
    end
end





L1[function]04. 参数的传递

函数得参数就是函数得局部变量


注意 如果函数的参数 传递的不是普通变量  而是对象  常见的对象比如table类型  表变量里面存储的其实只是一个指针 作为函数参数传递的也是一个指针地址   参数为对象 在函数内部对这个对象的指针进行一系列操作 可不是想数值 字符串那样 对外面的这个变量没影响



--这个函数只是把传递进来的表第一个元素变为100
function test2(a)
    if (type(a)=="table") then
        a[1]=100
    else
        print("not table")
    end
end
xx={1,2,3,4,5}--创建表赋初值
for v,k in pairs(xx) do--遍历出表的初值
    print(v,k)
end
print("=================")
test2(xx) --把xx表变量传递进来进行处理
for v,k in pairs(xx) do--再次看下 表变量的变化
    print(v,k)
end
--结果就是如果参数为对象 那么函数在内部处理该对象也很有可能影响到该对象在外部的内容




结果

1    1
2    2
3    3
4    4
5    5
=================
1    100
2    2
3    3
4    4
5    5
程序于 0.20 秒完成 (pid: 16008).


小知识:lua的闭包理解

 

小知识:upvalue其实可以理解为c下的静态局部变量

静态局部变量的常见特点

1.函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作

2.auto自动变量会随着函数被调用和退出而存在和消失,而static类局部变量不会消失 。它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。换言之,Static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量


L1[function]05. 可选参数

小知识 可变参数 没什么说的 参数数量不确定的时候的选择 …   但是又一些特殊情况 比如参数里面夹杂了值nil 那么遍历所有参数会出现问题



function test(...)
    --接受参数汇总成1个表
    local tempTable=table.pack(...)
    
    --遍历参数表
    if (type(tempTable)=="table") then
        for v,k in pairs(tempTable) do
            print(k)
        end
    else
        print("not table")
    end
end
test(1,2,3,4,5,6,7,8,9,0)



特殊情况 比如参数里面夹杂了值nil 那么遍历所有参数会出现问题 为了避免这个情况  可变参数的函数基本结构应该如此



function test(...)
    --接受参数汇总成1个表
    local tempTable=table.pack(...)
    print(tempTable.n)--这个n属性是table.pack的自带属性 是包含了表内所有元素个数 就算是表元素有很多nil干扰 它依然可以获取元素个数
    
    --遍历参数表
    if (type(tempTable)=="table") then
        --下面这种遍历只能正确的输出value ,key无法保证
        for i=1,tempTable.n do            
             print(tempTable[i])
        end
    else
        print("not table")
    end
end
test(1,2,nil,4,5,nil,nil,8,9,0)



结果

1
2
nil
4
5
nil
nil
8
9
0

可变参数还可以和固定参数混搭  不过固定参数必须要在前面 可变参数垫底

function test(a,b,c,…)


小知识:调用函数的时候 规定多少参数一定要一一对应 不能不写 易语言下 似乎可以空出来 但是lua下必须一一对应 不行就在对应位置加个nil也行 不会报错



function test1(a,b,c)
    print(a,b,c)
end
test1(1,,3)--报错D:\Program Files (x86)\zerobrane\bin\lua53.exe: E:\lua\test18.lua:21: unexpected symbol near ','
test1(1,nil,3)



123

小知识:函数默认值的写法 参数为nil我们就赋一个初值给它即可 但是注意参数内容为false的时候默认值出错



function test1(a,b,c)
    --设置默认值 懒得说
    a=a or 1
    b=b or 2
    c=c or 3
    
    print(a,b,c)
end
test1(2,nil,4)



结果

2    2    4

当然 传递进来的参数内容不能是false  这样默认值会选择错误的值 不过一般情况下 不会出现



function test1(a,b,c)
    a=a or 1
    b=b or 2
    c=c or 3
    
    print(a,b,c)
end
test1(false,nil,4)--结果1    2    4  但是我第一个参数命名是传递的false这个布尔值 却返回1个数值1



123


L1[function]06. 可变长参数

L1[function]07. 按键插件函数例子

小知识:按键插件的lua的写法。很简单  就是函数写法有点要求 其他没什么

function QMPlugin.test()

end