table.insert(t, i)和t[#t+1] = i有什么区别?
在 Lua 中,似乎有两种将元素添加到数组中的方法:
table.insert(t, i)
和
t[#t+1] = i
我应该使用哪一种,为什么呢?
原文链接 https://stackoverflow.com/questions/6112710
使用哪个取决于个人喜好和情况:由于 #
长度运算符是在版本 5.1 中引入的,因此 t[#t+1] = i
在 Lua 5.0 中将无效,而 table.insert
自 5.0 版本以来就存在,可以在两个版本中使用。另一方面,t[#t+1] = i
仅使用语言级别的运算符,而 table.insert
则涉及一个函数(稍微有一些开销来查找和调用,并且依赖于环境中的 table
模块)。
在 Programming in Lua 的第二版(Lua 5.0 导向的第一版的更新)中,Lua 设计者 Roberto Ierusalimschy 表示他更喜欢 t[#t+1] = i
,因为它更加可见。
此外,根据您的使用情况,答案可能是“都不是”。请参阅长度运算符的行为的手册条目:
如果数组中有“空洞”(也就是在其他非空值之间的 nil 值),那么 #t 可以是任何一个直接前置 nil 值的索引(也就是说,它可能将任何这样的 nil 值视为数组的末尾)。
因此,如果您处理带有空洞的数组,则使用其中之一(table.insert
使用长度运算符)可能会将您的值附加到数组中比您想要的更低的索引。在这种情况下,如何定义数组的大小取决于您的喜好和情况:您可以使用 table.maxn
(在 5.2 中消失但易于编写),您可以在表中保留一个 n
字段,并在必要时更新它,您可以将表包装在元表中,或者您可以使用更适合您情况的其他解决方案(在循环中,立即在循环外部作用域中使用 local tsize
通常就足够了)。
下面的内容有点有趣,但可能会涉及到一些审美的问题。虽然 mytable:operation()
没有像 mystring:operation()
一样提供明显的原因,但人们可以轻松地自己创建变体,并且如果需要,可以得到第三种符号。
Table = {}
Table.__index = table
function Table.new()
local t = {}
setmetatable(t, Table)
return t
end
mytable = Table.new()
mytable:insert('Hello')
mytable:insert('World')
for _, s in ipairs(mytable) do
print(s)
end
#
运算符只能用于索引键表。
t = {1, 2, 3, 4, 5, x=1, y=2}
在上述代码中,
print(#t) --> 输出 5 而不是 7
#
运算符并不总是实用的。
如果你要使用 #
运算符,那么你需要检查表元素的类型。
insert
函数可以使用任何类型,但元素数量较多时速度变慢,而 #
运算符更为快速。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
insert
可以在任意位置插入元素(顾名思义),但默认位置为#t + 1
,而t[#t + 1] = i
则总是将元素附加到表(末尾)。参见 the lua manual 的第 5.5 节。