Lua table.insert 不接受字符串参数
Lua table.insert does not accept a string parameter
继续学习Lua。
我写了一个函数,从每一行中删除第一句,returns 结果作为修改行的 table,其中第一句被删除。奇怪的是,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)
为什么 "number expected" 排在第一位?
来自 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
returns 两个参数;第二个参数是匹配的数量。
table.insert
可以带3个参数。当它被赋予 3 个参数时,第二个参数应该是一个整数偏移量,定义插入对象的位置。
执行此操作时:func1(func2())
、所有 func2
的 return 值将传递给 func1
,只要你不在 func1
的参数列表中的 func2
之后传递参数。所以 func1(func2(), something_else)
只会得到 2 个参数。
因此,当您执行 table.insert(ins, string.gsub(...))
时,这将调用 3 参数版本,它期望第二个参数是将对象插入到的索引。因此问题。
如果你想确保丢弃,那么你可以将表达式括在括号中:
table.insert(new_lns, (string.gsub(lns[i], "^[^.]+. ", "", 1)))
继续学习Lua。
我写了一个函数,从每一行中删除第一句,returns 结果作为修改行的 table,其中第一句被删除。奇怪的是,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)
为什么 "number expected" 排在第一位?
来自 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
returns 两个参数;第二个参数是匹配的数量。table.insert
可以带3个参数。当它被赋予 3 个参数时,第二个参数应该是一个整数偏移量,定义插入对象的位置。执行此操作时:
func1(func2())
、所有func2
的 return 值将传递给func1
,只要你不在func1
的参数列表中的func2
之后传递参数。所以func1(func2(), something_else)
只会得到 2 个参数。
因此,当您执行 table.insert(ins, string.gsub(...))
时,这将调用 3 参数版本,它期望第二个参数是将对象插入到的索引。因此问题。
如果你想确保丢弃,那么你可以将表达式括在括号中:
table.insert(new_lns, (string.gsub(lns[i], "^[^.]+. ", "", 1)))