0基礎lua學習(十四)封裝

魚醬2333發表於2017-11-06
People = {age=18}
function People:new()
    print(type(self))
    local p = {}
    setmetatable(p,self)
    print(p)
    print(self)
    self.__index = self
    return p
end



function People:growup()
    self.age = self.age +1
    print(self.age)
end


--物件p1
p1 = People:new()
p1:growup()
p1:growup()
--物件p2
p2 = People:new()
p2:growup()

console:
19
20
19
分析:p1和p2是 完全獨立的兩個物件

print(type(self))不難發現,我們的self其實是一個table
self.__index = self做的其實就是,把p的元表設定為 People

小結:
print(type(self)),發現我們的self其實是一個table

People = {age=18}

function People:new()
    local p = {}
    setmetatable(p,self)
    self.__index = self
    print(self)
    return p
end



function People:growup()
    self.age = self.age +1
end


--物件p1
print(People)
print("-------------")
p1 = People:new()
print(p1)
p2 = People:new()
print(p2)

table: 0027B520

table: 0027B520
table: 0027B638
table: 0027B520
table: 0027B6B0

分析:
我們people的列印,和self列印是一樣的。
我的理解是people這個表,裡面存著new方法/age屬性/growup方法。
但是p2和p1之所以是兩個物件的原因是,
self.__index = self。
設定 local p表的元表為people,並且p會擁有自己的people元表。
也就是p1和p2 各自有一個元表people,互相獨立。

讓我們看這個方法:

__index 元方法這是 metatable 最常用的鍵。
Lua查詢一個表元素時的規則,其實就是如下3個步驟:
1.在表中查詢,如果找到,返回該元素,找不到則繼續
2.判斷該表是否有元表,如果沒有元表,返回nil,有元表則繼續。
3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是一個表,則重複1、2、3 如果__index方法是一個函式,則返回該函式的返回值(table和鍵會作為引數傳遞給函式)。

setmetatable 其實就是設定 元表物件

相關文章