2013-10-26 39 views
1

我試圖在函數中使用in pairs,但它不起作用,它只是打印第一行(鍵)。這是我的代碼:成對打印一張表

set = {1,2,3,4}; 
unset = {5,6,7,8}; 

    function listen(ftype) 
     if (ftype == [[~]]) then 
      for num,str in pairs(set) do 
       return str; 
      end 
     end 
     if (ftype == [[$]]) then 
      for num,str in pairs(unset) do 
       return str; 
      end 
     end 
    end 

    print(listen([[~]])..[[ =:= ]]..listen([[$]])); 

如果我做這樣的事情..

for num,str in pairs(unset) do 
    print(str); 
end 

它的工作原理就像一個魅力。這正是我想要的,但是在一個函數中。

+0

您預期的輸出是什麼? –

+0

1 =:= 5 2 =:= 6 3 =:= 7 4 =:= 8 – luafreak

回答

2

函數不能多次返回。將一個無條件return置於循環內是無意義的 - 它永遠不會進入循環的第二次迭代。

你基本上試圖從函數返回多個值。 Lua支持這一點;你可以,例如,只需return 1,2,3,4。對於未知數量的返回值,你可以在一個表中建立起來,並呼籲unpack就可以了,就像這樣:

function listen(ftype) 
    local result = {} 
    local num, str 
    if (ftype == [[~]]) then 
     for num,str in pairs(set) do 
      table.insert(result, str) 
     end 
    elseif (ftype == [[$]]) then 
     for num,str in pairs(unset) do 
      table.insert(result, str) 
     end 
    end 
    return unpack(result) 
end 

但你的結果已經在情侶表,這將是愚蠢的重建他們那樣。您可以將原件打開:

function listen(ftype) 
    if (ftype == [[~]]) then 
     return unpack(set) 
    elseif (ftype == [[$]]) then 
     return unpack(unset) 
    end 
end 

很好。但是當你把函數調用放入一個像你的print語句這樣的表達式時,它只會返回第一個值,這會讓你回到開始的位置。

因此,要打印出你對,你無法避免要麼:

1)做一些迭代功能

2)做實際的打印功能

最乾淨的解決方案可能是一個自定義迭代器,正如@YuHao所建議的那樣。

+0

添加評論,所以你會發現,我已經顯著編輯我的答案;我希望額外的信息是有幫助的。感謝您接受它,但我認爲@ YuHao's對您更有用。 –

7

你可以建立自己的迭代:

function double_pair(t1, t2) 
    local i = 0 
    return function() i = i + 1 
       return t1[i] and t1[i] .. " =:= " .. t2[i] 
      end 
end 

然後你可以使用它像這樣:

for str in double_pair(set, unset) do 
    print(str) 
end 

輸出:

1 =:= 5 
2 =:= 6 
3 =:= 7 
4 =:= 8 

注意,你不需要分號結束你的陳述,除非陳述是在一行中,並且你想讓它們清楚。而[[ =:= ]]通常用於構建長長的多行字符串,通常我們選擇使用雙引號" =:= "或單引號' =:= '