理解Lua中的__index和__newindex
程序员文章站
2022-07-05 11:03:51
复制代码 代码如下:
--example:
local temp_table ={
10, ...
复制代码 代码如下:
--example:
local temp_table ={
10,
1,
index1 = "hello",
index2 = "world",
index3 = "lua",
index4 = "language",
lang = "lua language",
}
temp_table.__add = function(a, b) return 3 end
for _, value in pairs(temp_table) do
print(value)
end
local temp_metable_table = {
index1 = "temp_new_metable_index1",
index2 = "temp_new_metable_index2",
key = "temp_new_metable_key_end",
}
for _, metable_value in pairs(temp_metable_table) do
print(metable_value)
end
--只能访问temp_table的方法
--setmetatable(temp_metable_table, temp_table) --如果setmetable 为这种方式的话,那么我不能够对metable进行原子操作
--print(temp_metable_table + temp_table)
--如果是这种方式的话,我们只能访问它的原子,也就是它的数据成员
--[[setmetatable(temp_metable_table, {__index = temp_table} )
print(temp_metable_table[1])
print(temp_metable_table["lang"])--]]
--如果是__newindex的话,我们可以访问原table,找到相关的key,除此之外,你还可以自己给原table添加数据成员
setmetatable(temp_metable_table, {__newindex = temp_table} )
temp_metable_table[5] = 100
print(temp_metable_table[5])
print(temp_table[5])
复制代码 代码如下:
window = {}
window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,}
window.mt = {}
function window.new(o)
setmetatable(o ,window.mt)
print(getmetatable(o))
print(getmetatable(window.mt))
return o
end
window.mt.__index = function (t ,key) //由于__index 给赋予了funcion,一个匿名函数
-- body
return 1000
end
w = window.new({x = 10 ,y = 20})
print(w.a) //在这里虽然没有a这个成员,但是会默认a为__index所绑定的function返回值作为a的值
复制代码 代码如下:
window = {}
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)
总结:
如果在元table中去找相应的操作,例如__index,__newindex等,如果有则直接访问,如果没有就新添加进元table中
上一篇: Lua之wrap函数用法示例
下一篇: Lua中的函数代码实例