プログラミングの魔物

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

Luaの文法で遊ぶ2「リファレンスチェーン」

リファレンスチェーンを簡単に利用できるように分解してみた。

サンプルプログラム

--リファレンスチェーン生成関数
local function ref(t, call)
	return setmetatable({t}, {
		__index = function (self, k)
			table.insert(self, k)
			return self
		end,
		__call = call})
end

Class = {}

--リファレンスチェーンを処理するメソッド。ローカル関数でも問題はない。
function Class:apply()
	local u = unpack or table.unpack  --5.1と5.2の互換用
	self[1][self[#self]](u(self, 1, #self - 1))
end

--サンプルメソッド
function Class:show(...)
	for i, v in ipairs{...} do
		print(v)
	end
end

--関数風呼び出し
function Class:__call()
	return ref(Class, Class.apply)
end

setmetatable(Class, Class)

Class().hoge.hage.hige.show()

出力結果

hoge
hage
hige

applyでリファレンスチェーンを分解し、showメソッドに"hoge","hage","hige"を渡している。
・・・遊んでないで本読もう。