僅針對本身函數
__index是:當咱們訪問一個表中的元素不存在時,則會觸發去尋找__index元方法,若是不存在,則返回nil,若是存在,則返回結果lua
1 Window = {} 2 3 Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,} 4 Window.mt = {} 5 function Window.new(o) 6 setmetatable(o ,Window.mt) 7 return o 8 end 9 Window.mt.__index = function (t ,key) 10 -- body 11 return 1000 12 end 13 w = Window.new{x = 10 ,y = 20} 14 print(w.wangbin)
打印結果是:1000。這裏能夠看出,咱們在new的時候,w這個表裏其實沒有wangbin這個元素的,咱們重寫了元表中的__index,使其返回1000,意思是:若是你要尋找的元素,該表中沒有,那麼默認返回1000。spa
備註:__index也能夠是一個表,咱們這裏也能夠寫__index = {wangbin = 1000},打印的值仍然能夠是1000。
prototype
__newindex:當給你的表中不存在的值進行賦值時,lua解釋器則會尋找__newindex元方法,發現存在該方法,則執行該方法進行賦值,注意,是使用rawset來進行賦值code
1 Window.mt = {} 2 function Window.new(o) 3 setmetatable(o ,Window.mt) 4 return o 5 end 6 Window.mt.__index = function (t ,key) 7 return 1000 8 end 9 Window.mt.__newindex = function (table ,key ,value) 10 if key == "wangbin" then 11 rawset(table ,"wangbin" ,"yes,i am") 12 end 13 end 14 w = Window.new{x = 10 ,y = 20} 15 w.wangbin = "55" 16 print(w.wangbin)
這裏的打印結果是:yes,i am。w這個表裏原本沒有wangbin這個元素的,咱們重寫了元表中__newindex,並在__newindex方法中從新進行賦值操做,而後,咱們對這個本不存在的原色w.wangbin進行賦值時,執行__newindex方法的賦值操做,最後,打印結果即是:yes,i am
blog
rawget是爲了繞過__index而出現的,直接點,就是讓__index方法的重寫無效。get
1 Window = {} 2 3 Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,} 4 Window.mt = {} 5 function Window.new(o) 6 setmetatable(o ,Window.mt) 7 return o 8 end 9 Window.mt.__index = function (t ,key) 10 return 1000 11 end 12 Window.mt.__newindex = function (table ,key ,value) 13 if key == "wangbin" then 14 rawset(table ,"wangbin" ,"yes,i am") 15 end 16 end 17 w = Window.new{x = 10 ,y = 20} 18 print(rawget(w ,w.wangbin))
打印結果是:nil。這裏的元表中__index函數就再也不起做用了。io
1 Window = {} 2 Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,} 3 Window.mt = {} 4 function Window.new(o) 5 setmetatable(o ,Window.mt) 6 return o 7 end 8 Window.mt.__index = function (t ,key) 9 return 1000 10 end 11 Window.mt.__newindex = function (table ,key ,value) 12 table.key = "yes,i am" 13 end 14 w = Window.new{x = 10 ,y = 20} 15 w.wangbin = "55"
咱們的程序就stack overflow了。可見,程序陷入了死循環。由於w.wangbin這個元素原本就不存在表中,而後這裏不斷執行進入__newindex,陷入了死循環。table