luaクラスの実装
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つの概念を話します.次に、コードを見て、クラスを実装する方法を示します.
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")