2017-07-02 130 views
1

比方說,我在Lua的字典(即包含字符串類型的索引Lua的表),象這樣:是否有可能在Lua中創建迭代器來迭代字典?

local my_dictionary = {a = 123; b = 321; c = 456; d = 654}; 

我所要做的是創建一個迭代器功能,可以遍歷表即使它的索引是字符串類型;有點像對,然而無論何時我試圖調用next()來獲取下一個索引,值都只返回索引,如果索引是int類型的值。我有一個想法可能是調用(索引):byte(1,-1)並加上int的元組,並將其用作一種假冒索引,只是爲了跟蹤索引,但我不認爲這將在下一個工作。這基本上是我到目前爲止有:

local function each(list) 
    if #list > 0 then 
     local function my_itr(lst, ind) 
      return next(lst, ind); 
     end 
     return my_itr, List, 0; 
    end 
    return function() end, nil, nil; 
end 

這僅適用於與詮釋指數(數組表)的表,所以我想知道是否有人可以幫助我。 謝謝。 編輯:爲了使這個少模糊這裏有一個例子一塊的什麼,我試圖完成代碼:

local mytable = {a = 123; b = 321; 3, 2, 1, c = "bca"}; 
for i,v in each(mytable) do 
    print(i,v); 
end 

它應該輸出:

>a 123 
>b 321 
>1 3 
>2 2 
>3 1 
>c bca 

輸出就不必在確切的順序。

+0

你的問題很難理解。我可以猜測你想按照字典順序迭代字符串鍵,但是仍然可以發表一個你想要實現的例子,例如一張表,一段代碼和所需的輸出。 – iehrlich

+0

當然,我只是編輯它;謝謝 –

+2

你上面說過,你只想返回int索引,但是你想要的輸出顯示與'pairs()'相同的行爲。這是什麼?順便說一下,這個頁面顯示瞭如何實現'pairs':https://www.lua.org/pil/7.3.html。 – luther

回答

2

應該正是按照您希望它與一對夫婦的調整的:在List弄不好錯字,並通過nil,而不是0

local function each(list) 
    local function my_itr(lst, ind) 
    return next(lst, ind) 
    end 
    return my_itr, list, nil 
end 

local mytable = {a = 123; b = 321; 3, 2, 1, c = "bca"} 
for i,v in each(mytable) do 
    print(i,v) 
end 

這將打印以下對我來說,這是你要什麼需要:

1 3 
2 2 
3 1 
a 123 
b 321 
c bca 
2

您可以通過使用pairs實現這一目標非常行爲。不要將它與ipairs混淆 - 但這是兩種不同的表遍歷函數!

雖然ipairs僅遍歷表中的整數密鑰(通常它也停止在第一不存在的整數鍵),pairs橫穿表中的所有鍵 - 值對。

因此,通過寫

local mytable = {a = 123; b = 321; 3, 2, 1, c = "bca"}; 
for i, v in pairs(mytable) do 
    print(i, v); 
end 

你會得到所有鍵值對印刷,在一些隨機的順序。這是demo

作爲旁註,在Lua中不存在'字典'這樣的事情 - 所有關聯數組都被稱爲'表'。

+0

我的意思不是粗魯,我希望這聽起來不粗魯,但這並不能回答我的問題。我對iterator工廠有所瞭解;我正在嘗試使自己的迭代器的功能類似於對。不過謝謝您的幫助。 –

+0

不粗魯。那麼,你的目標就是重新實現'pairs'?好吧。它是否包含重新實現'next'? :) – iehrlich

+0

嗯,起初我只是試圖重新實現對;但是現在你接下來提到了,我想如果我真的想重新實現對,那麼我也不得不在下一次重新實現,但我不確定是否可以在不進入某些C代碼的情況下重新實現。 –