就像我有两张桌子:
{["a"] = "aaa"}
和 {["b"] = "bbb"}
并把它做成一张表:{["a"] = "aaa", ["b"] = "bbb"}
我已经尝试过这段代码:
function ListConcat(t1,t2)
for i=1,#t2 do
t1[#t1+1] = t2[i]
end
return t1
end
local function getkeys(tab)
local keyset={}
local n=0
for k,v in pairs(tab) do
n=n+1
keyset[n]=k
end
return keyset
end
local function has_value (tab, val)
for index, value in ipairs(tab) do
if value == val then
return true
end
end
return false
end
function TableConcat(t1, t2)
local key1s = getkeys(t1)
local key2s = getkeys(t2)
local keys = ListConcat(key1s, key2s)
local rtb = {}
for i=1,#keys do
local key = keys[i]
if has_value(key1s, key) then
rtb[key] = t1[key]
else
rtb[key] = t2[key]
end
end
return rtb
end
我哪里错了,有更简单的解决方案吗? 没有任何作用,尝试了其他代码。而且我不需要像其他人的问题一样打印它。
虚拟代码:
local funcs = require("funcs")
a = {["a"] = "a"}
b = {["b"] = "b"}
print(funcs.TableConcat(a, b)) -- Wanted: {["a"] = "a", ["b"] = "b"}
-- Returns: {["a"] = "a"}
这是一种非常复杂的方法。
无论如何,错误在于
ListConcat
。该函数应该返回一个新列表,但您实际上正在修改第一个列表并返回该列表。这导致 key1s
和 keys
将相同。这使得
if has_value(key1s, key) then
对于所有键都是如此。
一个更简单的解决方案就是这样做
function TableConcat(t1, t2)
local rtb = {}
for k,v in pairs(t2) do
rtb[k] = v
end
for k,v in pairs(t1) do
rtb[k] = v
end
return rtb
end