読者です 読者をやめる 読者になる 読者になる

プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

Luaでレコードアクセス

遊びで書いたコードなので実用的ではないけど、発展させれば面白いかも知れない。
SQLとは文法が違うけど意図としてはそういう感じ。

たとえばLuaで以下の様なレコードがあった時に

records = {
	{name="takashi", age=20},
	{name="takeshi", age=21},
	{name="takei", age=22},
	{name="taki", age=20},
	{name="taku", age=19},
}

age==20をこんな感じで取得できたら良いなぁと思って書いてみた。

r = records.select.age(20)

メタテーブルquery

query = {
	__index = function (t, k)
		if k == "select" then
			return setmetatable({}, {__index = function (self, k)
				return function (v)
						local result = {}
						for i, r in ipairs(t) do
							if r[k] == v then
								table.insert(result, r)
							end
						end
						return result
					end
				end})
		end
	end
}

--レコードにメタテーブルをセットする
setmetatable(records, query)

レコードからage==20を取得

r = records.select.age(20)

for i, v in ipairs(r) do
	print(v.name, v.age)
end
--実行結果
--> takashi	20
--> taki	20

レコードからname=="takeshi"を取得

r = records.select.name("takeshi")

for i, v in ipairs(r) do
	print(v.name, v.age)
end
--実行結果
--> takeshi	21

recordsを中継するために__indexを利用している。