このようなアイテムのリストがある場合:
local items = { "Apple", "orange", "pear", "banana" }
このリストに「オレンジ」が含まれているかどうかを確認するにはどうすればよいですか?
Python私ができること:
if "orange" in items:
# do something
Luaに同等のものはありますか?
Programming in Lua のセットのようなものを使用できます。
function Set (list)
local set = {}
for _, l in ipairs(list) do set[l] = true end
return set
end
その後、リストをセットに入れてメンバーシップをテストできます。
local items = Set { "Apple", "orange", "pear", "banana" }
if items["orange"] then
-- do something
end
または、リストを直接反復処理することもできます。
local items = { "Apple", "orange", "pear", "banana" }
for _,v in pairs(items) do
if v == "orange" then
-- do something
break
end
end
代わりに次の表現を使用してください。
local items = { Apple=true, orange=true, pear=true, banana=true }
if items.Apple then
...
end
データ構造が1つしかないLuaの短所の1つを直接目にしています。 Luaを使い続けると、好きなようにテーブルを操作する関数のライブラリが徐々に蓄積されます。私のライブラリには、リストからセットへの変換と高次のリスト検索機能が含まれています。
function table.set(t) -- set of list
local u = { }
for _, v in ipairs(t) do u[v] = true end
return u
end
function table.find(f, l) -- find element v of l satisfying f(v)
for _, v in ipairs(l) do
if f(v) then
return v
end
end
return nil
end
Luaテーブルは、リストではなくPython辞書に類似しています。作成するテーブルは、基本的に1ベースの文字列のインデックス付き配列です。標準の検索アルゴリズムを使用して、値が別のアプローチは、Jon Ericsonの投稿のセット実装に示されているように、代わりに値をテーブルキーとして格納することです。
function valid(data, array)
local valid = {}
for i = 1, #array do
valid[array[i]] = true
end
if valid[data] then
return false
else
return true
end
end
以下は、データが配列内にあるかどうかを確認するために使用する関数です。
これは、使用できるスイスアーミーナイフ関数です。
function table.find(t, val, recursive, metatables, keys, returnBool)
if (type(t) ~= "table") then
return nil
end
local checked = {}
local _findInTable
local _checkValue
_checkValue = function(v)
if (not checked[v]) then
if (v == val) then
return v
end
if (recursive and type(v) == "table") then
local r = _findInTable(v)
if (r ~= nil) then
return r
end
end
if (metatables) then
local r = _checkValue(getmetatable(v))
if (r ~= nil) then
return r
end
end
checked[v] = true
end
return nil
end
_findInTable = function(t)
for k,v in pairs(t) do
local r = _checkValue(t, v)
if (r ~= nil) then
return r
end
if (keys) then
r = _checkValue(t, k)
if (r ~= nil) then
return r
end
end
end
return nil
end
local r = _findInTable(t)
if (returnBool) then
return r ~= nil
end
return r
end
これを使用して、値が存在するかどうかを確認できます。
local myFruit = "Apple"
if (table.find({"Apple", "pear", "berry"}, myFruit)) then
print(table.find({"Apple", "pear", "berry"}, myFruit)) -- 1
キーを見つけるためにそれを使用できます:
local fruits = {
Apple = {color="red"},
pear = {color="green"},
}
local myFruit = fruits.Apple
local fruitName = table.find(fruits, myFruit)
print(fruitName) -- "Apple"
recursive
パラメータがそれ自体を物語っていることを願っています。
metatables
パラメーターを使用すると、メタテーブルも検索できます。
keys
パラメーターは、関数がリスト内のキーを探すようにします。もちろん、これはLuaでは役に立ちません(ただfruits[key]
)recursive
およびmetatables
と一緒に使用すると便利です。
returnBool
パラメーターは、テーブルのキーとしてfalse
を含むテーブルがある場合の安全策です(はい、可能です:fruits = {false="Apple"}
)
メタテーブルを使用したソリューションの並べ替え...
local function preparetable(t)
setmetatable(t,{__newindex=function(self,k,v) rawset(self,v,true) end})
end
local workingtable={}
preparetable(workingtable)
table.insert(workingtable,123)
table.insert(workingtable,456)
if workingtable[456] then
...
end