zoukankan      html  css  js  c++  java
  • Lua笔记——6.弱表Weak Table

    Lua中的基本类型:nil、boolean、number、string、function、userdata、thread、table,后四种为引用类型,在赋值、传参、函数返回等都操作是对象的引用

    在没有引入弱表时,所有对象的引用皆为强引用,对于强引用表,当表中的对象没有任何引用才会被GC回收

    例如:

    --file:weakTest.lua
    require "util"
    
    local pos = {x = 800 , y = 400}
    local size = {width = 500 , heigh = 300}
    local note = {msg = "message", title = "Tips"}
    
    local label= {}
    label[1] = pos                                   -->表中key为number类型,value为一个table
    label[2] = size                                  -->表中key为number类型,value为一个table
    label[note] = "Use A Table As Key"               -->表中key为table类型 ,value为一个string
    label["id"] = 123456789                          -->表中key为string类型 ,value为一个number
    label["echo"] = function() print(label.id) end   -->表中key为string类型 ,value为一个function
    
    print("
    --------------Set reference to nil,and Call collectgarbage()------------:")
    -->设置pos,size表为nil,但是表label的1,2号索引仍在引用,所以label[1]、label[2]指向的对象不会被回收
    pos = nil
    size = nil
    -->设置note表为nil,但是仍作为表label的key值被引用,所以不会被回收
    note = nil
    -->表labeld中string类型的key的value类型为number,都是值类型
    label.id = nil
    -->表labeld中string类型的key的value类型为function,function对象没有任何的其他引用,内存将会被回收
    label.echo = nil
    collectgarbage()
    util:PairsPrint(label)
    

    设置弱表之后,weak表中的引用是弱引用(weak reference),弱引用不会导致对象的引用计数变化。即如果一个对象只有一个弱引用指向它,那么GC将会自动回收该对象的内存:

    print("
    --------------Set Weak Table {__mode = "k"},and Call collectgarbage()------------:")
    setmetatable(label,{__mode = "k"})
    collectgarbage()
    util:PairsPrint(label)
    

    在弱表中的__mode字段可以取以下三个值:k、v、kv,其中"k"表示table.key是weak的,也就是table的keys是弱引用可以被自动回收, "v"表示table.value是弱引用,也就是table的values能被自动回收, "kv"即是key和value都是弱引用,当一个对象只有若有用时那么这个keyvaluepair将被从表中移除

    输入结果:

    weaktable

    REF

    http://lua-users.org/wiki/

    http://lua-users.org/wiki/WeakTablesTutorial

  • 相关阅读:
    Redis必须注意的慢查询问题
    使用kuernetes提供高可用的logstash服务
    使用kuernetes提供高可用的kibana服务
    Docker指定multiple Insecure registry的方法
    ELK系统中kibana展示数据的时区问题
    ElasticSearch快照备份及恢复
    离线安装redis集群
    Elasticsearch静态集群配置
    LCM的个数 (LCM Cardinality,UVa 10892)
    幂和阶乘 (Again Prime?No time.,UVa 10780)
  • 原文地址:https://www.cnblogs.com/sylvan/p/9688519.html
Copyright © 2011-2022 走看看