對lua繼承中self.__index = self的釋疑


首先看看從lua表中查找一個鍵時的流程:

-- 當從表t中查找鍵k時,lua處理如下:
-- 1.t中是否有k,有則直接返回值,否則第2步
-- 2.t是否有元表, 無則返回nil, 有則第3步
-- 3.t的元表是否有__index元方法, 無則返回nil, 有則查找__index指向的表或對應的方法

---注意兩種寫法
-- 寫法1, 可以保持繼承鏈
local class = {}

function class:new()
	self.__index = self
	return setmetatable( {}, self )
end

function class:say()
	print(111)
end

local o1 = class:new()
o1.say()

local o2 = o1:new()
o2.say()

--- 寫法2, 只能繼承1次, 第2次派生時沒了__index元方法
local class = {}
class.__index = class

function class:new()
	return setmetatable( {}, self )
end

function class:say()
	print(111)
end

local o1 = class:new()
o1.say()

-- 第2次繼承失敗了, 因為o1並沒有__index元方法
local o2 = o1:new()
o2.say()

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM