对lua继承中self.__index = self的释疑(转)
转自:http://www.cnblogs.com/tudas/p/how-to-understand-lua-oo-self__index.html
首先看看从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()