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文档

Inserts element value at position pos in list, shifting up the
elements list[pos], list[pos+1], ···, list[#list]. The default value
for pos is #list+1, so that a call table.insert(t,x) inserts x at the
end of list 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可以有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)))
点赞