Lua是個面向過程的語言, 但通過Metatable可以模擬出面向對象的樣子. 其關鍵就在于__index這個域. 他提供了表的索引值入口. 這很像重寫C#中的索引器, 當表要索引一個值時如table[key], Lua會首先在table本身中查找key的值, 如果沒有并且這個table存在一個帶有__index屬性的Metatable, 則Lua會按照__index所定義的函數邏輯查找. 仔細想想, 這不正為面向對象中的核心思想繼承, 提供了實現方式么. Lua中實現面向對象的方式非常多, 但無論哪種都離不開__index.
local bb = {cancry = true}
function bb:new()
b = {}
self.__index = self--改變自己的索引值入口
setmetatable(b, self)--將b的索引值入口設成self,即(local bb = {cancry = true})
return b
end
local ostrich = bb:new()
print(ostrich.cancry)另外一個教程:
Person={}
function Person:new(p)
local obj = p
if (obj == nil) then
obj = {name="ChenHao", age=37, handsome=true}
end
self.__index = self--是怕self被擴展后改寫,所以,讓其保持原樣
return setmetatable(obj, self)--返回第一個參數
end
function Person:toString()
return self.name .." : ".. self.age .." : ".. (self.handsome and "handsome" or "ugly")
end上面我們可以看到有一個new方法和一個toString的方法。其中:
1)self 就是 Person,Person:new(p),相當于Person.new(self, p)
2)new方法的self.__index = self 的意圖是怕self被擴展后改寫,所以,讓其保持原樣
3)setmetatable這個函數返回的是第一個參數的值。
于是:我們可以這樣調用:
me = Person:new()
print(me:toString())
kf = Person:new{name="King's fucking", age=70, handsome=false}
print(kf:toString())
繼承:
Student = Person:new()
function Student:new()
newObj = {year = 2013}
self.__index = self
return setmetatable(newObj, self)
end
function Student:toString()
return "Student : ".. self.year.." : " .. self.name
endstudent = Student:new() print(student:toString())
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。