2017-07-02 16 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 

int型のインデックスを持つテーブルに対してのみ動作(配列表)ので、誰も私を助けることができる場合、私は思っていました。おかげさまで 編集:ここでは、これはあまり曖昧ようにするには、私が達成しようとしています何のコードの例の一部です:

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()'と同じ動作を示します。どちらですか?ところで、このページはhttps://www.lua.org/pil/7.3.htmlの 'pairs'の実装方法を示しています。 – luther

答えて

2

あなたが微調整のカップルとそれをしたいとそれが正確に動作するはずです:Listにタイプミスし、代わりに0nilを渡し修正:

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と混同しないでください - これらは2つの異なるテーブルトラバーサル関数です!

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

私は失礼であることを意味するわけではありません。私はこれが失礼にはならないと願っていますが、それは私の質問に答えません。私は反復子の組を知っています。私はペアと同様の機能を持つ独自のイテレータを作ろうとしています。しかし、助けてくれてありがとう。 –

+0

全く失礼ではありません。だから、あなたの目標は単純に '対'を再実装することです? OKをクリックします。 'next'を再実装することを含んでいますか? :) – iehrlich

+0

まず、私はペアを再実装しようとしていました。しかし、今度はあなたが次に言及したように、私は本当にペアを再実装したいと思っていましたが、次に実装する必要があります。しかし、Cコードに入ることなく次の実装を再実装できるかどうかはわかりません。 –

関連する問題