当前位置: 首页 > article >正文

Lua可变参数函数

基础规则

lua传入参数给一个function时采用的是“多余部分被忽略,缺少部分有nil补足”的形式:

function f(a, b)
    return a or b
end
  
CALL        PARAMETERS
f(3)        a=3, b=nil
f(3, 4)     a=3, b=4
f(3, 4, 5)  a=3, b=4 (5 is discarded)

unpack/pack

table.unpack和table.pack分别是数组的拆装处理,unpack函数输入数组,返回数组的所有元素:

tb = {1,2,3}
a,b,c = table.unpack(tb)
print(a) --1
print(b) --2
print(c) --3

pack函数输入多值,返回由这些值组成的数组:

a = table.pack(1,2,3)
print(a) --table: 000002687821C910
print(a.n) --3

table.pack(...)就是在外面包一层{},即{ ... }.

实际上table.unpack()函数可以通过以下lua代码来实现:

function unpack(tb,i)
    i = i or 1
    if tb[i] then
        return tb[i],unpack(tb,i+1)
    end
end

为什么提到unpack函数,是后面需要配合另一个机制使用。

...和arg的应用

在函数参数列表中使用三点(...)表示函数有可变的参数,print实际上就是用了这点来无限拼接字符串:

function printMySelf( ... )
    local strResult = ""
    for i,v in ipairs(table.pack(...)) do
        strResult = strResult..v
    end
    print(strResult)
end

printMySelf(1,"a","b",2) --1ab2

在lua5.1版本之前,可以在函数中使用arg来定位可变参数,在函数内部arg就等于table.pack(...),即如下:

function select(n, ...)
    return arg[n]
end

print(string.find("hello hello", " hel")) --> 6 9
print(select(1, string.find("hello hello", " hel"))) --> 6
print(select(2, string.find("hello hello", " hel"))) --> 9

但是5.1版本之后这上面的select函数会因为去掉了arg全局关键字而报空:

print(select(1, string.find("hello hello", " hel"))) --> nil
print(select(2, string.find("hello hello", " hel"))) --> nil

所以后续版本需要显式强调arg才行:local arg = { ... }

由此我们可以传入一个table.unpack的数组,然后用...机制操作参数即可:

function printMySelf( ... )
    local strResult = ""
    for i,v in ipairs(table.pack(...)) do
        strResult = strResult..v
    end
    print(strResult)
end

local tbNeedPrint = {"hello!","world"}
printMySelf(table.unpack(tbNeedPrint)) --hello!world

http://www.kler.cn/news/233705.html

相关文章:

  • 使用virtualenv管理python环境
  • 如何将ChatGPT升级到4.0版本?如何充值?
  • Acwing---837. 连通块中点的数量
  • PCB板 3.3V和GND导通原因
  • 【NICN】之计算一个数的每位之和(递归实现)
  • Dubbo源码一:【Dubbo与Spring整合】
  • C语言中的宏定义:从常量到高级技巧
  • 十、项目开发总结报告(软件工程)
  • ubuntu篇---ubuntu安装python3.9
  • “深度解析Java虚拟机:运行时数据区域、垃圾收集、内存分配与回收策略、类加载机制“
  • 【前端高频面试题--TypeScript篇】
  • 从Unity到Three.js(画线组件line)
  • 微软AD域替代方案,助力企业摆脱hw期间被攻击的窘境
  • 【MySQL】-12 MySQL索引(上篇MySQL索引类型前置-2-高性能的索引策略)
  • Linux应用 进程间通信之共享内存(System V)
  • Webpack源码浅析
  • 【java苍穹外卖项目实战二】苍穹外卖环境搭建
  • 数据结构——单向链表和双向链表的实现(C语言版)
  • (三)elasticsearch 源码之启动流程分析
  • docker安装-centos
  • 统计数字出现次数的数位动态规划解法-数位统计DP
  • python 如何自定义异常
  • CVE-2021-42013 漏洞复现
  • java_error_in_pycharm.hprof文件是什么?能删除吗?
  • 算法之双指针系列1
  • [python-opencv] PNG 裁切物体
  • 【春节特辑】回顾与展望:运维软件领域的2023与2024
  • 计算机网络-差错控制(奇偶校验码 CRC循环冗余码)
  • SpringCloud-搭建Nacos服务中心
  • 【前端高频面试题--Vue生命周期篇】