【发布时间】:2017-05-23 02:34:06
【问题描述】:
继续学习 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]。默认值 for 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
现在一切正常。你能解释一下这里发生了什么吗?
【问题讨论】:
-
string.gsub返回两个值而不是一个,并调用table.insert的另一个(重载)版本 -
嗯,其中一个值对
print是不可见的? -
@minerals:它不是隐形的。当您有一个导致多个值的表达式并将其分配给较少的值时,多余的值将被丢弃。所以
local nofirst = string.gsub(...)会丢弃第二个值。