Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua中表的串联_Lua_Concatenation_Lua Table - Fatal编程技术网

Lua中表的串联

Lua中表的串联,lua,concatenation,lua-table,Lua,Concatenation,Lua Table,原创帖子 鉴于Lua中没有内置函数,我正在寻找一个可以将表附加在一起的函数。我在谷歌上搜索了很多次,尝试了我偶然发现的每一个解决方案,但似乎没有一个能正常工作 场景是这样的:我正在使用嵌入到应用程序中的Lua。应用程序的内部命令以表的形式返回值列表 我试图做的是在循环中递归调用该命令,并将返回的值(同样以表的形式)附加到以前迭代的表中 编辑 对于那些在将来遇到此帖子的人,请注意@gimf发布的内容。由于Lua中的表与数组非常相似(即使在列表上下文中),因此没有真正正确的方法将一个表附加到另一个

原创帖子

鉴于Lua中没有内置函数,我正在寻找一个可以将表附加在一起的函数。我在谷歌上搜索了很多次,尝试了我偶然发现的每一个解决方案,但似乎没有一个能正常工作

场景是这样的:我正在使用嵌入到应用程序中的Lua。应用程序的内部命令以表的形式返回值列表

我试图做的是在循环中递归调用该命令,并将返回的值(同样以表的形式)附加到以前迭代的表中


编辑


对于那些在将来遇到此帖子的人,请注意@gimf发布的内容。由于Lua中的表与数组非常相似(即使在列表上下文中),因此没有真正正确的方法将一个表附加到另一个表。最接近的概念是合并表。有关这方面的帮助,请参阅“”一文。

如果您想合并两个表,但需要结果表的深度副本,无论出于何种原因,请使用“合并自”和“深度副本代码自”

(编辑 好吧,也许你可以编辑你的问题来提供一个最小的例子…如果你的意思是一个表格

 { a = 1, b = 2 }
与另一个表连接

{ a = 5, b = 10 }
应该导致

{ a = 1, b = 2, a = 5, b = 10 }
那你就倒霉了。钥匙是独一无二的。

似乎您希望有一个对列表,如
{{a,1},{b,2},{a,5},{b,10}
。根据您的应用程序,您还可以使用最后的结构,如
{a={1,5},b={2,10}

但是,简单的“连接”表的概念对于Lua表没有意义。

通常,在Lua中,连接任意表的概念没有意义,因为单个键只能有一个值

在某些特殊情况下,串联是有意义的。一种是针对包含简单数组的表,这可能是用于返回结果列表的函数的自然结果

在这种情况下,您可以编写:

-- return a new array containing the concatenation of all of its 
-- parameters. Scaler parameters are included in place, and array 
-- parameters have their values shallow-copied to the final array.
-- Note that userdata and function values are treated as scalar.
function array_concat(...) 
    local t = {}
    for n = 1,select("#",...) do
        local arg = select(n,...)
        if type(arg)=="table" then
            for _,v in ipairs(arg) do
                t[#t+1] = v
            end
        else
            t[#t+1] = arg
        end
    end
    return t
end
这是一个浅层副本,不会试图找出
userdata
或函数值是否是某种可能需要不同处理的容器或对象

另一种实现可能会修改第一个参数,而不是创建新表。这将节省复制成本,并使
array\u concat
不同于字符串上的
运算符


编辑:正如在的评论中所观察到的,我未能从
中正确提取每个参数的实际值。我也无法从函数返回合并表。这就是我在答案框中编码而根本不测试代码的结果。

这里有一个实现,我做的与上面的RBerteig类似,但是使用了隐藏参数arg,当函数接收到可变数量的参数时,该参数可用。就个人而言,我认为这比select语法更具可读性

function array_concat(...)
    local t = {}

    for i = 1, arg.n do
        local array = arg[i]
        if (type(array) == "table") then
            for j = 1, #array do
                t[#t+1] = array[j]
            end
        else
            t[#t+1] = array
        end
    end

    return t
end

要同时添加两个表,请执行以下操作

    ii=0
for i=#firsttable, #secondtable+#firsttable do
    ii=ii+1
    firsttable[i]=secondtable[ii]
end
使用第一个表作为要添加的变量,因为代码会按顺序将第二个表添加到第一个表的末尾

  • i
    是表格或列表的起始编号
  • #secondtable+#firsttable
    是结束语

它从要添加到的第一个表的末尾开始,并在
for
循环中的第二个表的末尾结束,因此它适用于任何大小的表或列表。

过复杂的答案有多少

以下是我的实现:

function TableConcat(t1,t2)
    for i=1,#t2 do
        t1[#t1+1] = t2[i]  --corrected bug. if t1[#t1+i] is used, indices will be skipped
    end
    return t1
end

做你想做的事的简单方法:

local t1 = {1, 2, 3, 4, 5}
local t2 = {6, 7, 8, 9, 10}

local t3 = {unpack(t1)}
for I = 1,#t2 do
    t3[#t1+I] = t2[I]
end
还有一个方法:

for _,v in ipairs(t2) do 
    table.insert(t1, v)
end

在我看来,它是最可读的一个——它迭代第二个表,并将其值附加到第一个表,即故事的结尾。奇怪的是,上面的显式索引[]在速度上有多快,这里是我连接一组纯整数索引表的实现,仅供参考

  • 定义一个连接两个表的函数,
    concat2tables
  • 另一个递归函数
    concatateTables
    :通过
    unpack
    拆分表列表,并调用
    concat\u 2tables
    来连接
    table1
    restableList

    t1 = {1, 2, 3}
    t2 = {4, 5}
    t3 = {6}
    
    concat_2tables = function(table1, table2)
        len = table.getn(table1)
        for key, val in pairs(table2)do
            table1[key+len] = val
        end
        return table1
    end
    
    concatenateTables = function( tableList )
        if tableList==nil then
            return  nil
        elseif table.getn(tableList) == 1 then
            return  tableList[1]
        else
            table1 = tableList[1]
            restTableList = {unpack(tableList, 2)}
            return concat_2tables(table1, concatenateTables(restTableList))
        end
    end
    
    tt = {t1, t2, t3}
    t = concatenateTables(tt)  
    

  • 如果要将现有表连接到新表,这是最简洁的方法:

    local t = {3, 4, 5}
    local concatenation = {1, 2, table.unpack(t)}
    

    尽管我不确定这在性能方面有多好。

    可能的重复:。你提到“循环递归”。您是否搜索深度复制+合并?以下是我找到的提供解决方案的链接:虽然我了解每种方法,但两者似乎都不起作用。你有有效的解决办法吗?gimpf,也许我不是很清楚。合并表和合并表是相似的,但非常不同。我对将一个表附加到另一个表很感兴趣,因此使用了concatenate这个词;举一个例子,以3个lua表(2进1出)的形式说明您想要做什么,这将非常有帮助。gimf,您是对的。我误解了表中列表的使用,认为它们可以简单地连接起来。进一步的测试让我得出结论,我真正需要做的是合并。谢谢你对Lua新手的帮助和耐心。@John,我们曾经都是新手。。。来自复杂语言,Lua的简单性中隐藏着多少力量有时令人惊讶。可能需要一段时间来摸索它。+1关于“函数的自然结果……返回结果列表”的概念。这是很有可能的。我认为此函数中有错误,我认为您需要在
    for
    之后的
    中选择另一个
    ,以获取
    的实际值。见第8Yup期。显然,我在发布之前没有测试这段代码,否则这个缺陷会很明显。事后来看,更明显的是在最后一个
    结束之前缺少
    返回t