2017-01-08 130 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)))