为什么需要 self.__index=self?
lua在一个表中查找元素的规则如下:
- 在表中查找,如果找到,返回该元素,找不到则继续
- 判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
- 判断元表有没有index方法,如果index方法为 nil,则返回nil;如果index方法是一个表,则重复1、2、3;如果index 方法是一个函数,则返回该函数的返回值。
我的疑惑: 为什么需要把__index设置为自己?
回答: 因为需要遵守lua第三条规则。
lua
local person = {name = 'default', age = 0}
function person:eat()
print(self.name .. ' 该吃饭了, 饿死了')
end
-- 代码段一
function person:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
local p = person:new()
print(p.name) -- default
-- 代码段二
function person:new1(o)
o = o or {}
setmetatable(o, self)
-- self.__index = self
return o
end
local p1 = person:new1()
print(p1.name) -- nil
上面两个print的结果是不一样的。 p1.name
查找逻辑是现在自己的表中找,没找到然后去person这个元表去找,但是因为person中没有实现__index元方法,所以就返回nil。
lua如何实现多态?
lua
local person = {name = 'default', age = 0}
function person:new()
local o = {}
setmetatable(o, self)
self.__index = self
return o
end
function person:eat()
print('person eat')
end
local boy = person:new()
-- 会调用person的方法
boy:eat() -- person eat
-- 重写eat的方法
function boy:eat()
print('boy eat')
end
-- 调用eat的方案
boy:eat()
上面代码就是一个简单的多态例子。