Lua中實現類的原理

2021-09-25 07:06:17 字數 1699 閱讀 3277

(1):metatable的中文名叫做元表。它不是乙個單獨的型別,元表其實就是乙個表。

(2):元表作為乙個表,可以擁有任意型別的鍵值對,其真正對被設定的表的影響是lua規定的元方法鍵值對。

這些鍵值對就是lua所規定的鍵,比如__index,__add,__concat等等。這些鍵名都是以雙下劃線__為字首。其對應的值則為乙個函式,被稱為元方法(metamethod),這些元方法定義了你想對錶自定義的操作。

(3):__index鍵,在lua中它所對應的元方法執行的時機是當查詢不存在於表中的鍵時應該做的操作。

注意:所有的表都可以設定元表,然而新建立的空表如果不設定,是沒有元表的。

如:

--定義元表m

m = {}

--定義元表的__index的元方法

--對任何找不到的鍵,都會返回"undefined"

m.__index = function ( table, key )

return "undefined"

end

--表pos

pos =

--初始沒有元表,所以沒有定義找不到的行為

--因為z不在pos中,所以直接返回nil

print(pos.z) -- nil

--將pos的元表設為m

setmetatable(pos, m)

--這是雖然pos裡仍然找不到z,但是因為pos有元表,

--而且元表有__index屬性,所以執行其對應的元方法,返回「undefined」

print(pos.z) -- undefined

根據以上定義,實現乙個類

person = 

function person:talk(words)

print(self.name.."說:"..words)

end--設定person的__index為自身

person.__index = person

--p是乙個例項

local p = {}

--p的元表設定為person

setmetatable(p, person)

p.name = "路人甲"

--p本來是乙個空表,沒有talk這個鍵

--但是p有元表,並且元表的__index屬性為乙個表person

--而person裡面有talk這個鍵,於是便執行了person的talk函式

--預設引數self是呼叫者p,p的name屬性為「路人甲」

p:talk("我是路人甲")

--於是得到輸出

--路人甲說:我是路人甲

為了方便,我們給人類乙個建立函式create:

function person:create(name)

local p = {}

setmetatable(p, person)

p.name = name

return p

end

local pa = person:create("路人甲")

local pb = person:create("路人乙")

pa:talk("我是路人甲") --路人甲說:我是路人甲

pb:talk("我是路人乙") --路人乙說:我是路人乙

摘自:

Lua 實現C 中的類

直接上 local mt function class clsname,base local cls base base or mt setmetatable cls,cls.clsname clsname or default cls.base base cls.new function loca...

Lua類的實現

cocos2dx中有關於lua類的實現,見cocos原始碼 framework functions。先講一部分比較難理解的 function class classname,super local cls inherited from lua object if super then cls set...

lua實現類的繼承

local class function class super local class type class type.ctor false class type.super super class type.new function local obj do 遞迴呼叫建構函式,實現構造基類的資料...