luaクラスの実装

966 ワード

luaは「クラス」と「オブジェクト」の概念はありませんが、tableとメタテーブルmetatableで実現できます.tableとmetatableを使う以上、その概念を明らかにしなければなりません.
tableとは?
tableは、実際にはリストであってもよいし、Mapであってもよい集合であり、function、userdataを含む任意のデータを保存することができる.
メタテーブルとは?
メタテーブルは、実は元のlua tableで、tableを操作するために使用されます.例えば、2つのtableが加算された論理操作では、luaは両者がメタテーブルを持っているかどうかを検出し、__があるかどうかをチェックします.addというkeyに対応するvalueは、存在すると、このvalueで操作されます.その中で、この_addに対応するvalueは、メソッドまたはtableのmetatableです.
tableとメタテーブルは、しばらくここまで話してから、後で単独で、この2つの概念を話します.次に、コードを見て、クラスを実装する方法を示します.
local A = {}

function A:new( ... )
	--  self   c++  java  this   ,  ‘:’,     self  
	local o = {}        --     table
	self.__index = self     --   A __index      
	setmetatable(o, self)   --     metatable  A(table  )
	self:ctor(...)  --       
	return o
end

--     
function A:ctor( ... )  
	local list = { ... }    -- table      
	for k, v in pairs( list ) do 
		print( tostring(v), type(v))
	end
end

--   
local a = A:new(123, "bbb")