Lua的物件導向寫法

2021-10-20 01:23:46 字數 2809 閱讀 7087

2 **例項

3 尾聲

最近閒的沒事玩 暗黑2 懷舊. 哈哈哈哈哈哈 .需要開8個遊戲一起操作,沒有工具太麻煩了.於是產生了寫個輔助工具的想法.

工具需求當然要求小巧可愛 開發方便.又容易修改.所以選了c#和lua相互配合.機緣巧合vs商店找到乙個庫neolua.找到了用了一下確實不錯就開工了.

工具寫好了.返回來發現blog裡面也沒有好好說過lua的一些東西.就突然又想寫個文章來說說lua的一些東西.

lua沒有提供語法糖來幹這個事情,所以要我們自己來.

首先說一下需要的知識點

這個翻譯過來叫元表.為什麼需要這個東西?原因在於物件導向需要繼承這個功能.也就說你要找東西,當前的類沒有,就會去找父類的東西.元表有乙個__index這個東西.它有個內定的功能就是當 a有乙個元表b. 並且 a的__index是b, 就會形成乙個類似繼承的關係.b有乙個成員a, 那麼a.a就會 跑去找到b.a.

這個語法糖用來實現物件導向看起來會舒服很多.他會隱式的在函式裡加入self.這個self就是呼叫者的引用.如果是.語法就寫起來很麻煩了

由於沒有class這種語法糖 所以lua寫肯定會有點彆扭,但是沒辦法.這裡我寫了乙個很簡單的例項

這個函式需要兩個引數 第乙個是新table,第二個是元表,返回值是擁有元表的新table.就是第乙個引數的table.檢視記憶體位址,是同乙個位址

下面的**有詳細的注釋:

ca =

--ca類 說白了就是乙個table

-- ca類的new, :的作用就是隱式的包含了self這個變數在函式裡.self就是ca

-- 如果用.語法當然也可以就是多寫幾個字比較累看起來也不爽

function ca:

new(

) self.__index = self -- 元表需要的東西 __index作用在於如果當前的table沒有的變數會到__index對應的table裡面找東西

self.a =

"a"--自定義的變數

self.b =

"b"--設定元表 元表的作用在於讓__index元方法生效,當你訪問table,如果table裡沒有你要的變數,那麼就會跑到index裡面找.找到了就會呼叫.

--這裡的寫法作用在於讓新{}擁有ca這個元表, self就是ca,ca就是乙個table,

--這裡也就實現了乙個功能: 也就說當我們用新例項呼叫a這個變數,這個新例項你取到的是{},什麼都沒有,但是這個{}有乙個元表就是ca,當我們

--要取a變數的值,實際上會找__index發現值是ca.ca這個table裡面有a 所以就取到了

return

setmetatable

(, self)

end-- 宣告乙個成員函式do

function ca:do(

)print

("ca:do a="

.. self.a)

end-- cb是乙個繼承ca的類.這裡相當於例項化了乙個新{}給cb,這個{}帶有乙個元表ca

cb = ca:

new(

)function cb:

new(

)-- 同理,self就是cb 現在相當於 cb的__index = cb, cb包含ca的例項, ca的__index = ca,

-- 所以你用cb的例項呼叫變數,會往上找.

self.__index = self

self.b =

"cb b"

-- 同理

return

setmetatable

(, self)

end-- 宣告乙個成員函式do

function cb:do(

)print

("cb:do a="

.. self.a)

end--實際上就是個空table但是有個元表ca

testa = ca:

new(

)--例項化乙個ca

-- 這個操作實際上是給{} 加了a.並不是改了ca.a. 所以不會影響到下面的cb.self就是ca

-- getmetatable(testa).__index.a = 111 或者 ca.a = 2222 --這樣才會影響到cb.因為你修改了ca的a值啊. ca就是乙個table

-- 也就說你這一步操作,會讓testa實際上有兩個a變數乙個在自己身上,乙個在元表ca上面,注意ca只是乙個table.

testa.a =

100--實際上就是個空table,但是這個空的table有個元表,這個元表的__index指向乙個空table

-- 這個空table的__index指向ca, 所以沒有的東西,最後都會找到ca頭上去

testb = cb:

new(

)--例項化乙個cb

--這裡肯定是列印出來100,原因很簡單testa:do, 這裡self就是新的{}. 上面a=100了當然列印出來100

testa:do(

)--ca:do a=100

--上面說的了testb的table關係,全程沒有找到a,最後肯定會找到ca頭上 所以是a

testb:do(

)--cb:do a=a

--這裡當然是100,因為給新的testa 設定了乙個100

print

(testa.a)

--100

--這裡testb是空的{}, 所以會去找元表, 當前元表是ca:new()出來的 __index就是這個ca:new(),

-- 實際上這時候也是空的沒有a,但是元表是ca,所以繼續找, 這時候也沒有a

print

(testb.a)

-- a

Lua的物件導向

index元方法用來對錶訪問,newindex元方法用來對錶更新 當通過鍵來訪問table的時候,如果這個鍵沒有值,那麼lua就會尋找該table的metatable 如果有metatable 中的 index鍵。如果 index指向乙個 lua會在 中查詢相應的鍵,如果 index指向乙個函式,l...

lua物件導向

直接貼 參考的也是別人的,只不過其中幾點,增加一點自己的理解 local baseclass print baseclass是 tostring baseclass 定義index屬性,指向本身 baseclass.index baseclass 定義建構函式 function baseclass ...

Lua 物件導向

記錄學習過程 建立日期 2019 04 14 物件由屬性和方法組成。lua中最基本的結構是table,所以需要用table來描述物件的屬性。lua 中的 function 可以用來表示方法。那麼lua中的類可以通過 table function 模擬出來。乙個簡單的物件導向例子 屬性 person ...