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)