lua中self指的是当前方法所属的table。一般来讲self可以理解为当前对象,但是在创建一个“类”的实例的时候,它代表的确是基类,而非当前对象。
下面上代码:
1 base = {} 2 3 function base:new(id) 4 local o = {} 5 setmetatable(o, self) 6 self.__index = self 7 self.gg= id ------------此处的self指的是base这个table,而不是你新创建的o。此处对self的操作,会影响其他实例。因为base被改变了 8 return o 9 end 10 11 function base:add(v) 12 self.gg = v -------------此处self指的是当前实例,即new方法中的o,而不是base 13 end 14 15 a1 = base:new(12) 16 a2 = base:new(4) -------修改了所有以base为metatable的实例(table) 17 18 print(a1.gg) -- 这里显示的是4,如果把new方法中的self.gg=id改为 o.gg=id,那么此处显示12 19 a2:add(13) 20 print(a1.gg) -- 由于add方法修改的self是当前实例,而不是base,因此a2的add方法,不会影响a1 21 print(a2.gg)