Lua table.insert 不接受字符串参数

Posted

技术标签:

【中文标题】Lua table.insert 不接受字符串参数【英文标题】:Lua table.insert does not accept a string parameter 【发布时间】:2017-05-23 02:34:06 【问题描述】:

继续学习 Lua。

我编写了一个函数,它从每一行中删除第一句,并将结果作为修改后的行表返回,其中第一句被删除。奇怪的是,table.insert 在这样的函数中表现得很奇怪。

function mypackage.remove_first(table_of_lines)
  local lns = table_of_lines
  local new_lns = 
  for i=1,#lns do
    table.insert(new_lns,string.gsub(lns[i],"^[^.]+. ","",1))
  end
  return new_lns
end

没想到,这给了我以下错误。

[string "function mypackage.remove_first(table_of_lines)..."]:5: bad argument #2 to 'insert' (number expected, got string)

为什么首先是“预期数字”?

来自table.insert docs

在列表中的位置 pos 处插入元素值,向上移动 元素列表[pos]、列表[pos+1]、···、列表[#list]。默认值 for pos 是#list+1,因此调用 table.insert(t,x) 将 x 插入到 列表 t 结束。

没有提及table.insert 的类型要求。好的,我决定修改示例。

function mypackage.remove_first(table_of_lines)
  local lns = table_of_lines
  local new_lns = 
  for i=1,#lns do
    local nofirst = string.gsub(lns[i],"^[^.]+. ","",1)
    table.insert(new_lns,nofirst)
  end
  return new_lns
end

现在一切正常。你能解释一下这里发生了什么吗?

【问题讨论】:

string.gsub 返回两个值而不是一个,并调用 table.insert 的另一个(重载)版本 嗯,其中一个值对print 是不可见的? @minerals:它不是隐形的。当您有一个导致多个值的表达式并将其分配给较少的值时,多余的值将被丢弃。所以local nofirst = string.gsub(...) 会丢弃第二个值。 【参考方案1】:

问题有点复杂。这是三个因素的碰撞:

    string.gsub 返回两个参数;第二个参数是匹配数。

    table.insert 可以带 3 个参数。当给定 3 个参数时,第二个参数应该是一个整数偏移量,用于定义插入对象的位置。

    当你这样做时:func1(func2())所有func2 的返回值都被传递给func1,只要你在@987654326 之后不传递参数@ 在func1 的参数列表中。所以func1(func2(), something_else) 只会得到 2 个参数。

因此,当您执行table.insert(ins, string.gsub(...)) 时,这将调用 3 参数版本,该版本期望第二个参数是插入对象的索引。于是就有了问题。

如果要确保丢弃,则可以将表达式括在括号中:

table.insert(new_lns, (string.gsub(lns[i], "^[^.]+. ", "", 1)))

【讨论】:

以上是关于Lua table.insert 不接受字符串参数的主要内容,如果未能解决你的问题,请参考以下文章

LUA table学习笔记

lua5.2中对table.insert的区别

如何将键值对象插入redis内部的lua表中

lua中table 库函数 insertremoveconcatsort的简单使用简记

Lua表数据中移除某项时一些值的问题

cocos2d-x-lua基础系列教程六(lua-table增删改查)