私はLuaで書かれたたくさんのデータファイルを扱っています。それらのほとんどは、このようにして、一例として、「電話帳」に書かれている:ルア、カスタムイテレータ - 適切な定義方法は?
data = {
-- First Level - country
USA = {
-- Second level - city
Denver = {
-- Third level - actual entries
{name = 'John', number = '12345'},
-- more entries
},
Washington = {
{name = 'Ann', number = '54321'},
-- more entries
},
-- more cities with entries
},
-- more countries with cities and entries
}
だから、最初のレベルが「国」であり、第二は、「都市」であるという事実は、暗黙のですが、それは、データがより多くを作りますコンパクト。
実際にいくつかのデータを検索するとき、このデータに対して、この平準化された暗黙の情報を含むエントリとして繰り返したいと思います。
-- Coroutine yielding entries including level data function corIter(data) for country,l1 in pairs(data) do for city,l2 in pairs(l1) do for _,entry in pairs(l2) do -- Copy the entry local out = {} for k,v in pairs(entry) do out[k] = v end -- Add level properties out.country = country out.city = city coroutine.yield(out) end end end end -- Iterate over the entries local cor = coroutine.create(corIter) local _, entry = coroutine.resume(cor, data) while entry do -- Handle the entry, has 'name', 'number', 'country' and 'city' keys table.print(entry) -- (custom print function I use) -- Get the next one _, entry = coroutine.resume(cor) end
しかし、私はこのアプローチが悪いかもしれないと思っています。特定の方法で気になるテーブルを繰り返し処理するだけでスレッド全体が生き続けるからです。
他にも「明白な」解決策がありますか?パフォーマンスと使いやすさの鍵があります。私は、(データテーブル内の任意の数の "レベル"について)一般的な解決策を必要としているわけではありませんが、これはすべてハックのようになりました。
あなたが考えているクエリの例を与えることができますか? – lhf