访问 table 中的元素,不存在的时候,寻找 __index
- Window = {}
-
- Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,}
- Window.mt = {}
- function Window.new(o)
- setmetatable(o ,Window.mt)
- return o
- end
- Window.mt.__index = function (t ,key)
- -- body
- return 1000
- end
- w = Window.new{x = 10 ,y = 20}
- print(w.wangbin)
-
设置 table 中的元素,不存在的时候,进行赋值
- Window.mt = {}
- function Window.new(o)
- setmetatable(o ,Window.mt)
- return o
- end
- Window.mt.__index = function (t ,key)
- return 1000
- end
- Window.mt.__newindex = function (table ,key ,value)
- if key == "wangbin" then
- rawset(table ,"wangbin" ,"yes,i am")
- end
- end
- w = Window.new{x = 10 ,y = 20}
- w.wangbin = "55"
- print(w.wangbin)
-
为了绕过 __index
- Window = {}
-
- Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,}
- Window.mt = {}
- function Window.new(o)
- setmetatable(o ,Window.mt)
- return o
- end
- Window.mt.__index = function (t ,key)
- return 1000
- end
- Window.mt.__newindex = function (table ,key ,value)
- if key == "wangbin" then
- rawset(table ,"wangbin" ,"yes,i am")
- end
- end
- w = Window.new{x = 10 ,y = 20}
- print(rawget(w ,w.wangbin))
- 打印结果是:nil。这里的元表中__index函数就不再起作用了
-
为了绕过 __newindex
- Window = {}
- Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,}
- Window.mt = {}
- function Window.new(o)
- setmetatable(o ,Window.mt)
- return o
- end
- Window.mt.__index = function (t ,key)
- return 1000
- end
- Window.mt.__newindex = function (table ,key ,value)
- table.key = "yes,i am"
- end
- w = Window.new{x = 10 ,y = 20}
- w.wangbin = "55"
-
然后我们的程序就 stack overflow 了。可见,程序陷入了死循环。