将Lua中的一个表分配给另一个表。
2013-7-9 13:6:37
收藏:0
阅读:235
评论:4
在 Lua 中,我可以使用 table.insert(tableName, XYZ) 在表内添加项。是否有一种方法将已存在的表添加到表中?我指的是直接调用而不是遍历并添加它。谢谢。
点赞
用户1685701
首先:通常情况下,你 不需要 使用 table.insert 来向表中添加新条目。
在 Lua 中,表是键值对的集合;可以像这样添加条目:
local t = {} -- 表
local key= "name"
local value = "Charlie"
t[key] = value -- 新增一个条目(替换相同键值下已有的值!)
print(t.name) --> "Charlie"
请注意,key 可以是 任何类型 的(不仅限于整数/字符串)!
很多时候,你会需要一个简单特殊情况下使用表:一个值序列(“列表”,“数组”)。对于 Lua,这意味着你希望一个表中的所有键都是连续的整数,并且包含非 nil 值。table.insert 函数就是为了处理这种特殊情况:它允许你在特定位置插入一个值(如果没有指定位置,则将其附加到序列的末尾):
local t = {"a", "b", "d"} -- 包含三个字符串的序列(t[1] = "a",...)
table.insert(t, "e") -- 将 "e" 附加到序列中
table.insert(t, 3, "c") -- 在索引 3 处插入 "c"(移动较高索引处的值)
-- 输出整个序列
for i=1,#t do
print(t[i])
end
2013-07-09 13:37:47
用户204011
如果我正确理解了你的意思,你想要做到这个:
local t1 = {1, 2, 3}
local t2 = {4, 5, 6}
some_function(t1, t2)
-- t1 is now {1, 2, 3, 4, 5, 6}
确实没有办法在不迭代t2的情况下实现它。下面是一种编写some_function的方法:
local some_function = function(t1, t2)
local n = #t1
for i=1,#t2 do t1[n+i] = t2[i] end
end
2013-07-09 13:42:20
用户2226988
不,你必须将第二个表的键值对复制到第一个表中。从第二个表复制现有值被称为“浅拷贝”。第一个表将引用与第二个表相同的对象。
这在有限的情况下有效:
local n = #t1
for i=1,#t2 do t1[n+i] = t2[i] end
它尝试将t2元素移到现有t1元素后面。这可能是至关重要的要求,但在问题陈述中并没有提到。
然而,它还有一些问题:
- 通过使用
#t1和#t2,它会忽略非正整数的键,可能会错过整数比跳过的整数键更大的键(即从未被分配或分配为nil)。 - 它使用索引器访问第一个表,因此可能会调用
__newindex元方法。当只需要复制时,这可能不是理想的。 - 它使用索引器访问第二个表,因此可能会调用
__index元方法。当只需要复制时,这是不希望的。
也许您认为如果只需要正整数键,则可以使用ipairs,但它在找到第一个nil值时退出,因此可能会错过比#t2更多的值。
使用pairs代替:
for key, value in pairs(t2) do
rawset( t1, key, value )
end
如果您确实想要在键匹配时避免替换现有的t1值或以某种方式映射t2键,则必须在需求中定义。
底线:pairs是获得所有键的方法。它有效地执行rawget,因此避免了调用__index。使用rawset可以在不调用__newindex的情况下进行复制。
2013-07-09 15:29:49
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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中获取用户配置主目录的跨平台方法
你的示例中的插入将适用于 XYZ 变量中的任何内容(数字、字符串、表、函数等)。
但这不会复制表,而是将实际表插入。如果你想要插入表副本,则需要遍历它并插入内容。