函数 table.unpack

简介: 函数 table.unpack

多重返回值还涉及到一个特殊的函数 table.unpack 。该函数的参数是一个数组,返回值为数组内的所有元素:

print(table.unpack({10,20,30})) --> 10    20    30
a,b = table.unpack({10,20,30})  --> a=10, b=20, 30被丢弃


顾名思义,函数 table.unpack 与函数 table.pack 的功能相反。 pack 把参数列表转换成 Lua 语言中一个真实的列表(一个表),而 unpack 则把 Lua 语言中的真实的列表(一个表)转换成一组返回值,进而可以作为另一个函数的参数使用。


unpack 函数的重要用途之一体现在泛型调用(generic call)机制中。泛型调用机制允许我们动态地调用具有任意参数的任意函数。例如,在 IOS C 中,我们无法编写泛型调用的代码,只能声明可变长参数的函数或使用函数指针来调用不同的函数。但是,我们仍然不能调用具有可变数量参数的函数,因为 C 语言中的每一个函数调用的实参个数是固定的,并且每个实参的类型也是固定的。而在 Lua 语言中,却可以做到这一点。


如果我们想通过数组 a 传入可变的参数来调用函数 f ,那么可以写成:

f(table.unpack(a))


unpack 会返回 a 中的所有元素,而这些元素又被用作 f 的参数。例如,考虑如下代码:

print(string.find("hello","ll"))


可以使用如下的代码动态地构造一个等价的调用:

f = string.find
a = {"hello", "ll"}
print(f(table.unpack(a)))


通常,函数 table.unpack 使用长度操作符获取返回值的个数,因为该函数只能用于序列。不过,如果需要,也可以显示地限制返回元素的范围:

print(table.unpack({"Sun","Mon","Tue","Wed"},2,3))    --> Mon   Tue


虽然预定义的函数 unpack 是用 C 语言编写的,但是也可以利用递归在 Lua 语言中实现:

function unpack(t, i, n)
  i = i or 1
  n = n or #t
  if i <= n then
    return t[i], unpack(t, i+1, n)
  end
end


在第一次调用该函数时,只传入一个参数,此时 i1n 为序列长度;然后,函数返回 t[1]unpack(t, 2, n) 返回的所有结果,而 unpack(t, 2, n) 又会返回 t[2]unpack(t, 3, n) 返回的所有结果,依次类推,直到处理完 n 个元素为止。


思考

采用递归的方式会不会出现堆栈内存溢出?(js就会)

目录
相关文章
|
5月前
|
JavaScript 关系型数据库 MySQL
如何去掉 node.js 获取MySQL数据产生的RowDataPacket
如何去掉 node.js 获取MySQL数据产生的RowDataPacket
|
JavaScript 前端开发 Java
关于 Node.js 参数 max-old-space-size
关于 Node.js 参数 max-old-space-size
|
测试技术 PHP
PHP:laravel自定义Model报错:$table must not be defined/$table must be string
PHP:laravel自定义Model报错:$table must not be defined/$table must be string
137 0
SAP Spartacus b2b table,通过listService的table type字段来控制要加载的数据类型
SAP Spartacus b2b table,通过listService的table type字段来控制要加载的数据类型
91 0
SAP Spartacus b2b table,通过listService的table type字段来控制要加载的数据类型
How to get table list belonging to a given package and all its sub packages
Created by Jerry Wang, last modified on Sep 02, 2016 Go to start of metadata
How to get table list belonging to a given package and all its sub packages
使用代码创建ABAP transparent table
使用代码创建ABAP transparent table
128 0
|
机器学习/深度学习 C++ Go