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

4

继续学习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

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

1
string.gsub 返回两个值而不是一个,并且调用了另一个(重载的)版本的 table.insert - Egor Skriptunoff
嗯,其中一个值对于“print”来说似乎是不可见的? - minerals
1
@minerals:它不是看不见的。当您有一个产生多个值的表达式,并将其分配给较少的值时,额外的值将被丢弃。因此,local nofirst = string.gsub(...)将丢弃第二个值。 - Nicol Bolas
1个回答

7
问题有点复杂。它涉及三个因素的碰撞:
1. `string.gsub` 返回两个参数,第二个参数是匹配次数。 2. `table.insert` 可以接收 3 个参数。当传入 3 个参数时,第二个参数应该是整数偏移量,用于定义要插入对象的位置。 3. 当你这样做:`func1(func2())`,只要你在 `func1` 的参数列表中不在 `func2` 后传递参数,`func2` 的所有返回值都将传递给 `func1`。所以 `func1(func2(), something_else)` 只会得到 2 个参数。
因此,当你执行 `table.insert(ins, string.gsub(...))` 时,这将调用 3 个参数版本,其期望第二个参数是要插入对象的索引。因此出现了问题。
如果你想确保丢弃,请将表达式括在括号中:
table.insert(new_lns, (string.gsub(lns[i], "^[^.]+. ", "", 1)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接