zoukankan      html  css  js  c++  java
  • openresty开发系列14--lua基础语法3函数

    openresty开发系列14--lua基础语法3函数

    一)function (函数)

    有名函数:

    optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
        function_body
        return result_params_comma_separated
    end

    optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。

    function 函数定义关键字

    function_name: 指定函数名称。

    argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。

    function_body: 函数体,函数中需要执行的代码语句块。

    result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开

    end:函数定义结束关键字

    1)函数实例

    --[[ 函数返回两个值的最大值 --]]
    function max(num1, num2)

       if (num1 > num2) then
          result = num1;
       else
          result = num2;
       end

       return result;
    end
    -- 调用函数
    print("两值比较最大值为 ",max(10,4))
    print("两值比较最大值为 ",max(5,6))


    匿名函数

    optional_function_scope function_name = function (argument1, argument2, argument3..., argumentn)
        function_body
        return result_params_comma_separated
    end


    有名函数的定义本质上是匿名函数对变量的赋值。为说明这一点,考虑

    function foo()
    end
    等价于
    foo = function ()
    end

    类似地,
    local function foo()
    end
    等价于
    local foo = function ()
    end


    local function 与 function 区别

    1 使用function声明的函数为全局函数,在被引用时可以不会因为声明的顺序而找不到
    2 使用local function声明的函数为局部函数,在引用的时候必须要在声明的函数后面

    function test()
        test2()
        test1()
    end

    local function test1()
        print("hello test1")
    end

    function test2()
        print("hello test2")
    end

    test()

    -----------------
    local function test1()
        print("hello test1")
    end

    function test()
        test2()
        test1()
    end

    function test2()
        print("hello test2")
    end

    test()

    ==========================

    函数参数

    1) 将函数作为参数传递给函数

    local myprint = function(param)
       print("这是打印函数 -   ##",param,"##")
    end

    local function add(num1,num2,functionPrint)
       result = num1 + num2

       functionPrint(result)
    end

    add(2,5,myprint)

    2)传参数,lua参数可变

    local function foo(a,b,c,d)
        print(a,b,c,d)
    end

    a、若参数个数大于形参个数,从左向右,多余的实参被忽略

    b、若实参个数小于形参个数,从左向右,没有被初始化的形参被初始化为nil


    c、Lua还支持变长参数。用...表示。此时访问参数也要用...,如:
    function average(...)
       result = 0
       local arg={...}
       for i,v in ipairs(arg) do
          result = result + v
       end
       print("总共传入 " .. #arg .. " 个数")
       return result/#arg
    end

    print("平均值为",average(1,2,3,4,5,6))


    3)返回值

    Lua函数允许返回多个值,返回多个值时,中间用逗号隔开

    函数返回值的规则:

      1)若返回值个数大于接收变量的个数,多余的返回值会被忽略掉;

      2)若返回值个数小于参数个数,从左向右,没有被返回值初始化的变量会被初始化为nil

        local function init()
            return 1,"lua";
        end

        local x,y,z = init();

        print(x,y,z);

    注意:

      1)当一个函数返回一个以上的返回值,且函数调用不是一个列表表达式的最后一个元素,那么函数只返回第一个返回值

        local function init()
            return 1,"lua";
        end

        local x,y,z = 2,init();  --local x,y,z = init(),2;

        print(x,y,z);

        
        2)如果你确保只取函数返回值的第一个值,可以使用括号运算符
        local function init()
            return 1,"lua";
        end

        local x,y,z = 2,(init());

        print(x,y,z);

  • 相关阅读:
    SqlServer事务语法及使用方法
    mysql解决自动断开8小时未曾用过的链接
    JIRA license申请和语言包下载
    String literal is not properly closed by
    android开发 NDK 动态链接多个第三方库(so)
    vim字符串替换
    VMware tools的用途及安装[跨系统文件拖拽]
    十大高明的Google搜索技巧
    安装ADT-20.0.3的时候产生org.eclipse.cdt.feature.group 0.0.0' but it could not be ..
    [Android NDK]修复/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 问题
  • 原文地址:https://www.cnblogs.com/reblue520/p/11429715.html
Copyright © 2011-2022 走看看