Lua易忘點

僅針對本身函數

 

__index的理解

__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的理解

__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和rawset的理解

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

相關文章
相關標籤/搜索