Lua简要笔记-2
2015年03月29日 Lua

接上文,控制语句下来就是一门语言不可或缺的一部分—函数。

函数

Lua中的函数可以做为First Class(第一类值),即函数可以做为变量赋值给其他变量,可以做为参数传递,还可以做为另一个函数的返回值返回,传递赋值返回之后,函数还可以通过func()的方式继续进行调用使用。

  • 函数形式

    function关键字

    1
    2
    3
    4
    5
    function LuaFunc(param1, param2)
    local val = param1 + param2
    -- do something
    return val
    end

    a). 函数名称LuaFunc,调用或者传递时使用这个名称,param1,param2形参,val是返回值,不必多说。

    b). 可以通过LuaFunc(1, 2)这种方式来调用。也可以local funcReceiver = LuaFunc这样来赋值。当然,

    你还可以这样调用,Lua并不会像静态编译语言一样进行参数个数匹配检查。

    LuaFunc(19) — 此时param2=nil

    LuaFunc(1, 2, 3) — 此时3没有任何作用,被舍弃

    也就是,少于形参个数之个的参数默认是nil,多于形参个数的参数默认被行么,这就lua函数的最基本形式。

  • 多个返回值

    Lua可以返回多个可以是不同类型的返回值,形式就是在return关键之后按逗号分隔所有需要返回的值即可。

    1
    2
    3
    function MultipleReturnVal(para1)
    return "bugcode", 26, {[2] = "bugcode.net"}, 1.0
    end

    如果MulitipleReturnVal只是单独调用,没有表达式,那所有的返回值都舍弃,如果有构成表达式,那Lua会保留尽可能多的返回值。如:

    local x, y, z = MultipleReturnVal(1),Lua会将x,y,z分别赋值为”bugcode”, 26, {[2] = “bugcode.net”},最后一个1.0没有接收的变量即被舍弃

    另一种情况如果接收的值多于返回的值,则多余的接收的值被置为nil。以上二个规则也同样适用于某个返回多个值的函数被另一个函数做为参数的情况

    如果想主动舍弃某个返回的变量, 使用下划线来占位即可,如:不想接收第三个是table的参数

    local x, y, _, z = MultipleReturnVal(1) — 这样返回值中第三个参数就会初舍弃

  • 变长参数。

    函数参数可能是多个不定数量的参数,这时就需要Lua的变长参数。用法非常简单:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    function VarArgsFunc(mixedParm, ...)
    local sum = 0
    for k, v in pairs(...) do
    if type(v) == "number" then
    sum = sum + v
    end
    end
    return sum
    end

    a). 变参使用三个点()来表示,可以把它想成一个table,也可以想成一个多返回值的函数,它可以被传递也可以赋值给别的变量。变参之前也可以有固定参数,传入实参会按顺序将参数赋值给对应的实参然后把其余的都传递给变参。

    b). 如上例,VarArgsFunc(1, 2, 3, 4, 5, 6, 7),这样调用会将1赋值给mixedParam,其余都在…中,这样在迭代体中,检测如果是数字类型就对其累加,最后的结果就是7个实参的后6个数之和。

  • 具名参数。

    普通的lua函数与其他编程语言的函数一样,函数参数都是函数定义时的函数参数一一对应,包括位置。

    1
    2
    3
    4
    5
    6
    7
    function LocationPara(str, num)
    string.format("string = %s", str)
    string.format("number = %f", num)
    end

    LocationPara("bugcode", 3.14)
    LocationPram(3.14, "bugcode") -- 会出问题

    如上例,参数位置不同了,可能就会出现各种问题。但是Lua并不支持类似这种func(first = “1”, second = “2”)语法,但是通过table可以变相的实现这种机制,就是函数只接收一个table类型的参数,然后table里的面的每个key都对应不同的名字,变相的要table里的value做参数值,key就是那个参数的名字。

    paramTable = {first = “0”, second = “0”}, 那再进行传参的时候就不必关心位置了,只需要关心table内的对应的key下的value是否赋值就可以了。

    1
    2
    3
    4
    5
    6
    7
    8
    local tbl = {second = "222", first = "111", num = 2}
    function NamedArgs(nameArgs)
    -- 类似这样,无需关心参数顺序,只需要关心参数值与值类型即可
    if nameArgs["first"] and type(nameArgs["first"]) == "string" then
    -- do something
    end
    --
    end

    下文继续记录Lua函数相关的深入要点。