2017-01-08 116 views
4

继续学习Lua。Lua table.insert不接受字符串参数

我写了一个函数,从每一行中删除第一句,并将结果作为修改后的行的表格返回,其中第一句删除。奇怪的是,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) 

为什么“数字预期”在第一位?在列表中的位置POS

table.insert文档

插入元件值,移位了 元素列表[POS],列表[POS + 1],...,列表[#list]。 pos的缺省值为 为#list + 1,这样一个调用table.insert(t,x)就会在列表t的末尾 处插入x。

没有关于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'的另一个(重载)版本被调用 –

+0

嗯,其中一个值对'print'是不可见的? – minerals

+1

@矿物质:它不是看不见的。当有一个表达式导致多个值,并将其分配给更少的值时,多余的值将被丢弃。所以'local nofirst = string.gsub(...)'会放弃第二个值。 –

回答

2

问题有点复杂。这三个因素的碰撞:

  1. string.gsub回报两个参数;第二个参数是匹配的数量。

  2. table.insert可以带3个参数。当给出3个参数时,第二个参数应该是一个整数偏移量,用于定义插入对象的位置。

  3. 当你这样做:func1(func2())所有func2的返回值被传递到func1,只要你不后func2func1的参数列表传递参数。所以func1(func2(), something_else)只会得到2个参数。

因此,当你做table.insert(ins, string.gsub(...)),这将调用3个参数的版本,预计第二个参数是插入对象到索引。因此,这个问题。

如果你想确保丢弃,那么你可以用括号中的表达式:

table.insert(new_lns, (string.gsub(lns[i], "^[^.]+. ", "", 1)))