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