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

继续学习 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 文档中可以看到:

将元素值插入列表中的位置 pos,将列表中的 list[pos],list[pos+1],...,list[#list] 向上移动。 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

现在一切正常了。你能解释这是怎么回事吗?

点赞
用户734069
用户734069

这个问题有点复杂。它涉及到三个因素:

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

  2. table.insert 可以取 3 个参数。当给予 3 个参数时,第二个参数期望是一个整数偏移量,用于定义插入位置。

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

因此,当你执行 table.insert(ins, string.gsub(...)),这将调用 3 个参数版本,期望第二个参数是插入对象的索引。因此会出现问题。

如果你想确保丢弃,你可以在表达式外面加上括号:

table.insert(new_lns, (string.gsub(lns[i], "^[^.]+. ", "", 1)))
2017-01-08 21:02:53