lua弱表引用

1、普通垃圾回收

[plain]  view plain  copy
  1. --lua弱表,主要是删除key或者value是table的一种元方法  
  2. --元表里的__mode字段包含k或者v;k表示key为弱引用;v表示value为弱引用  
  3.   
  4. local testa = {}  
  5. tbl_key = {}  
  6. testa[tbl_key] = 1  
  7. tbl_key = {}  
  8. testa[tbl_key] = 2  
  9.   
  10. --垃圾回收  
  11. collectgarbage()  
  12.   
  13. local function PrintInfo()  
  14.   
  15.     for k, v in pairs(testa) do  
  16.         print(k, "===", v)  
  17.     end  
  18.   
  19. end  
  20.   
  21. PrintInfo()  

显示结果:

[plain]  view plain  copy
  1. >lua -e "io.stdout:setvbuf 'no'" "Lua.lua"   
  2. table: 004FB890 === 1  
  3. table: 004FB8E0 === 2  
  4. >Exit code: 0  

2、设置弱引用为key

[plain]  view plain  copy
  1. local testa = {}  
  2. local mt = {__mode = 'k'}  
  3. setmetatable(testa,mt)  
  4.   
  5. tbl_key = {}  
  6. testa[tbl_key] = 1  
  7. tbl_key = {}  
  8. testa[tbl_key] = 2  
  9.   
  10. --垃圾回收  
  11. collectgarbage()  
  12.   
  13. local function PrintInfo()  
  14.   
  15.     for k, v in pairs(testa) do  
  16.         print(k, "===", v)  
  17.     end  
  18.   
  19. end  
  20.   
  21. PrintInfo()  

显示结果:

[plain]  view plain  copy
  1. >lua -e "io.stdout:setvbuf 'no'" "Lua.lua"   
  2. table: 006EB930 === 2  
  3. >Exit code: 0  

通过key的弱引用,覆盖了key为key_table的值;没有其他地方在引用,所以被回收掉了


3、设置弱引用为value

[plain]  view plain  copy
  1. local testa = {}  
  2. local mt = {__mode = 'v'}  
  3. setmetatable(testa,mt)  
  4.   
  5. tbl_key = {1,2,3}  
  6. testa[1] = tbl_key  
  7. tbl_key = {4,5,6}  
  8. testa[2] = tbl_key  
  9.   
  10. --垃圾回收  
  11. collectgarbage()  
  12.   
  13. local function PrintInfo()  
  14.   
  15.     for k, v in pairs(testa) do  
  16.         for key, value in pairs(v) do  
  17.             print(" value===", value)  
  18.         end  
  19.     end  
  20.   
  21. end  
  22.   
  23. PrintInfo()  

结果:

>lua -e "io.stdout:setvbuf 'no'" "Lua.lua" 
 value=== 4
 value=== 5
 value=== 6
>Exit code: 0

猜你喜欢

转载自blog.csdn.net/aa20274270/article/details/78682723
今日推荐