• 【小白学Lua】之Lua变长参数和unpack函数


    一、简介

      Lua的变长参数和unpack函数在实际的开发中应用的还挺多的,比如在设计print函数的时候,需要支持对多个变量进行打印输出,这时我们就需要用到Lua中的变长参数和unpack函数了。

    二、Lua变长参数与unpack函数

      Lua中支持可变参数,用 ... 表示。比如定义下面的这样一个函数:

    local function func1(...)
    end

      当然它也支持在变长参数前面添加固定参数:

    local function func1(var,...)
        --dosomething
    end

      我们在使用变长参数的时候,首先需要将其获取,然后再使用,代码如下:

     local function func(...)
        local args = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 
        print (#args)
     end
     
     func(1,2,"string",4,5)

      可以发现将变长参数用花括号进行打包以后,会得到一个table,之后就跟我们平时应用Lua没什么区别了。接着我们再来看看unpack函数,在Lua里面我们通常使用它来将数组形式的table拆开。这个函数有三个参数,第一个参数就是要拆的table,第二个参数是起始元素的下标,默认为1,第三个参数是结束元素的下标,默认为table的长度。函数原型如下:

      举个栗子,看看如何使用,由于其特性,unpack还可以作为尾调用来提供多个返回值:

    local info={1,2,3,4,5,6}
    local a,b,c,d,e,f = unpack(info)
    print(a,b,c,d,e,f)
    --输出结果:1   2   3   4   5   6
    
    local function func1 (t)
        return unpack(t)
    end
    local v1,v2,v3,v4,v5,v6 = func1(info)
    print(v1,v2,v3,v4,v5,v6)

      需要注意的一点是,如果遇到数组下有nil,或者有字母key的时候,unpack将会返回nil,代码如下:

    local info={1,2,3,nil,5,p=6}
    local a,b,c,d,e,f=unpack(info)
    print(a,b,c,d,e,f)
    输出结果:1   2   3   nil    5   nil

    三、小实例---拓展print函数

      我们都知道在lua中可以用print函数进行打印操作,它本身也支持传递变长参数,不过美中不足的就是它不支持打印table中的内容,比如下面的这段代码:

    print(1,2,3,{123,456})

      运行上面的这段代码,你通常会得到类似下面的这种输出:

    1       2       3       table: 00FE9950

      可以看到table中的元素没有被一一打印出来,因此我们可以利用lua的变长参数的功能来对print进行拓展,使他支持打印table中元素的内容:

     1 local raw_print = print
     2 
     3 local function printTable(t)
     4     if type(t) == "table" then
     5         for _,v in pairs(t) do
     6             if type(v) == "table" then
     7                 printTable(v)
     8             else
     9                 raw_print(v)
    10             end
    11         end
    12     end
    13 end
    14 
    15 local function printExt(...)
    16     local args = { ... }
    17     for _,v in pairs(args) do
    18         if type(v) == "table" then
    19             printTable(v)
    20         else
    21             raw_print(v)
    22         end
    23     end
    24 end
    25 
    26 rawset(_G,"print",printExt)
    27 
    28 print(1,2,3,{123,456,{"abc"},nil})

      简单说一下原理吧,先用局部变量将lua原始的print函数保存下来备用。然后分别定义printTable和printExt函数。printTable使用递归的方式对表中的元素进行遍历及打印。printExt会遍历外部传进来的多参数,然后根据类型进行分别处理。最后将全局环境中的原生print函数覆盖为我们自定义的printExt。运行效果如下:

    1
    2
    3
    123
    456
    abc

    四、总结

      在本篇博客中,马三同大家一起了解了Lua中变长参数和unpack函数的使用,并且通过拓展原生print函数的实例进行了练习。

    如果觉得本篇博客对您有帮助,可以扫码小小地鼓励下马三,马三会写出更多的好文章,支持微信和支付宝哟!

           

    作者:马三小伙儿
    出处:https://www.cnblogs.com/msxh/p/10054070.html  
    请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!

  • 相关阅读:
    http://blog.csdn.net/steveguoshao/article/details/38414145
    http://www.tuicool.com/articles/EjMJNz
    http://jingyan.baidu.com/article/7f41ecec1b7a2e593d095ce6.html
    Linux 查看当前时间和修改系统时间
    http://m.blog.csdn.net/article/details?id=49132747
    http://www.cnblogs.com/nick-huang/p/4848843.html
    javaScript事件(一)事件流
    jQuery选择器
    超链接a的target属性
    html基础总结版
  • 原文地址:https://www.cnblogs.com/msxh/p/10054070.html
Copyright © 2020-2023  润新知