lua setmetatable __index __newindex

local temp_table ={  
    10,  
    1,  
    Index1 = "hello",  
    Index2 = "world",  
    Index3 = "lua",  
    Index4 = "language",  
    lang = "lua language",  
}  


local tem_t = {
 test = 10;
}
tem_t.__index =  function (t, k)
print("tem_t", t, k)
return rawget(tem_t, k)
end


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)  
  
--如果是这种方式的话,我们只能访问它的原子,也就是它的数据成员
local tst ={


__index = function(t, k)
print("test0000000000000",t, k)
return temp_table[k]
end


--__newindex = temp_table


}


tst.__newindex = temp_table
setmetatable(temp_table, tem_t);
--setmetatable(temp_metable_table, tst )   
print(temp_metable_table[1])  




--print(temp_metable_table["lang"])
  
--如果是__newindex的话,我们可以访问原table,找到相关的key,除此之外,你还可以自己给原table添加数据成员  
setmetatable(temp_metable_table, {__newindex = temp_table, __index = temp_table} )   
--[[temp_metable_table[5] = 100  
print(temp_metable_table[5])  
print(temp_table[5]) 


print(temp_metable_table.test)
print(temp_table.test)--]]


print(temp_metable_table[1])  
print(temp_metable_table.test)

你可能感兴趣的:(lua)