lua self 點 冒號 元表 物件導向 繼承

2021-08-20 14:38:18 字數 3809 閱讀 4655

1: **如下:

a = {};

function a.test() 

end2: 冒號解決這個問題

a = {}

function a:test() :多了self這個機制

enda:test() 把a這個例項作為self傳遞給test函式,在test函式裡面訪問self就能獲得這個a;

3:顯示傳遞self

1: 每乙個表,可以為這個表設定乙個元表: metatable

2: 設定這個表的元表:setmetatable(table,metatable)

獲取這個表的元表:getmetatable(table) 

3: 元表__index鍵

metatable中的常用鍵;

如果在表裡面找不到的key,lua直譯器在元表裡面的__index表裡進行查詢;

1: 類的表 --> 類的例項的元表:

function classa:

2: 類的例項

function classa:new(instant) 

if not instant then 

instant = {} --類的例項

endsetmetatable(instant, ) 

return instant

end3: 類的例項呼叫類的方法:

self: 繫結的例項物件;

1: 子類的表是父類的乙個例項

2: 子類的表作為乙個原型再new了乙個表;

類的例項項-->元表-->子類的表-->元表-->父類的表;

3: 現在子類的例項找,找不到到元表找,元表找不到,到元表的元表找;

4: 子類過載父類的函式;

5: 子類呼叫父類的函式;

-- self點 冒號 元素 物件導向 繼承

--self機制

-- 點號 和 冒號的區別

-- 用冒號定義的函式, 多乙個機制 self

local a = {}

function

a.test(

self,

a, b)

print(

"a.test",

self)

print(a,b)

end a.

test(a,

3, 4)

local b = {}

function

b:test(

a,b)

-- self 呼叫這個函式的表的例項

print(

"b:test",

self)

print(a,b)

end b:

test(

5,6)

--在test函式裡面 self 就是 b

--self機制要正常執行,需要有兩個點:

-- (1) 定義的函式必須使用冒號(:) 才會隱式的傳遞self

--(2)定義用冒號,使用用冒號;定義用分號,使用用分號

-- end

print(

"###################")

-- 元表

local a =

local meta_a = }

-- 元表end

--兩個表相加,第乙個引數是乙個表,第二個引數也是乙個表

-- meta_a 叫做a的元表

setmetatable(a, meta_a)

--設定表的元表

print(

getmetatable(a))

--獲取表的元表

--元表裡面有乙個重要的key: __index

-- 特點: 當我們搜尋乙個表的key的時候,如果在當前的表裡面沒有搜尋的到,

-- 那麼lua直譯器會去表的元表裡面的__index的這個key所對應的表裡面來查詢

-- 優先在自己的表裡面查詢,在沒有找到的情況下,再去元表裡面查詢

print(a.

name)

--end

print(

"###################")

-- lua物件導向

local base =

-- 成員函式

function

base:test()

print(

"base:test")

endfunction

base:new(

instant)

if not instant

then

instant = {}

endsetmetatable(instant, )

return instant

end-- 可以定義其他很多的類的函式

-- base叫做類的表

--做乙個類的例項

local b = base:

new()

-- 在new裡面把新建立的例項的表的元表變成了base

b: test()

-- test self物件就是b

-- end

-- 物件導向的幾個特點

--[[

(1)定義類的表

(2)定義乙個例項的表

(3)位這個例項的表加乙個元表,並且元表__index指向這個類的表

]] print(

"########jicheng###########")

-- 繼承 過載

--基類: person

--子類: man

local person = {}

--基類的表

function

person:test()

print(

"person:test",

self)

endfunction

person:get_age()

print(

"person:get_age",

self)

endfunction

person:new(

instant)

if not instant

then

instant = {}

endsetmetatable(instant, )

return instant

endlocal man = person:

new()

-- 子類的表

function

man:test_man()

print(

"man:test_man",

self)

endfunction

man:test_man2()

print(

"man:test_man2",

self)

endfunction

man:get_age()

--過載 覆蓋基類的test

print(

"man:get_age")

end-- 例項化乙個子類,為man類例項化乙個類的表

local p = man:

new()

--new的self裡面不在是person 而是man,

-- p的元表裡面的__index = 類的表 p:

test_man()

-- 呼叫在man類裡面找到

print(

"p=",p,

"man=",man,

"person=",person) p:

test()

-- p-->man -- >person

p: get_age()

--過載get_age

-- 繼承end 過載end

LUA中的冒號 點和self

在lua程式設計中,經常會看到有時用點號定義乙個table的成員函式,有時卻用冒號,在呼叫的時候也是如此。那麼點號和冒號在使用上有什麼區別呢?它們與self之間又是什麼樣的關係呢?稍安勿躁,接下來謎底將一一為你揭開。下面先看乙個例子 class class.index class function ...

lua中的點 冒號與self

lua程式設計中,經常遇到函式的定義和呼叫,有時候用點號呼叫,有時候用冒號呼叫,這裡簡單的說明一下原理。girl function girl.gotomarket girl somemoney girl.money girl.money somemoney endgirl.gotomarket gi...

Lua中的點 冒號與self

lua中的點 冒號與self,它們之間的關係主要體現在函式的定義與呼叫上,lua在函式定義時可以用點也可以用冒號,如 function mytable.fun p return p endfunction mytable fun p return p end用冒號定義的函式有個特別的地方是它內部有個...