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

时间:2017-01-08 20:49:13

标签: lua lua-table

继续学习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]。默认值   对于pos是#list + 1,所以调用table.insert(t,x)在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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

  3. 执行此操作时:func1(func2())所有func2返回值都会传递给func1,只要你不这样做t在func2的参数列表中func1之后传递参数。所以func1(func2(), something_else)只会得到2个参数。

  4. 因此,当你执行table.insert(ins, string.gsub(...))时,这将调用3参数版本,该版本需要第二个参数作为插入对象的索引。因此问题。

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

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