变量和值的区别
变量是值的载体,变量消失,值却不一定消失
object
Tables, functions, threads, and (full) userdata values are objects: variables do not actually contain these values, only references to them. Assignment, parameter passing, and function returns always manipulate references to such values; these operations do not imply any kind of copy.
垃圾回收
能够被回收的对象包括:All memory used by Lua is subject to automatic management: tables, userdata, functions, threads, strings, etc.
强引用,弱引用
在没有引入弱表前,所有对象引用皆为强引用。当对象没有任何引用或仅为弱引用时,对象被回收(lua执行collectgarbage,c执行lua_gc)
弱表(weak table)
一个表是弱表,仅当
1. 该表有一个元表
2. 元表有成员__mode
3. __mode的取值为"k"或"v"或"kv",一次表示键是弱的,值是弱的或者键值都是弱的
要注意,只有对象才可以从一个weak table中被收集。比如数字和布尔值类型的值,都是不会被收集的。例如,如果我们在table中插入了一个数值型的key,它将永远不会被收集器从table中移除。当然,如果对应于这个数值型key的vaule被收集,那么它的整个入口(keyvaluepair)将会从weak table中被移除。
关于字符串的一些细微差别:尽管字符串是可以被收集的,他们仍然跟其他可收集对象有所区别。 其他对象,比如tables和函数,他们都是显示的被创建。比如,不管什么时候当Lua遇到{}时,它建立了一个新的table。任何时候这个 function()。。。end建立了一个新的函数(实际上是一个闭包)。然而,Lua见到“a”..“b”的时候会创建一个新的字符串?如果系统中已经有一个字符串“ab”的话怎么办?Lua会重新建立一个新的?编译器可以在程序运行之前创建字符串么?这无关紧要:这些是实现的细节。因此,从程序员的角度来看,字符串是值而不是对象。所以,就像数值或布尔值,一个字符串不会从weak tables中被移除(除非它所关联的vaule被收集)。
弱值(weak value)
如果弱表的值是弱的,那么当值所引用的object被垃圾回收时,键值对也从弱表中移除
弱键(weak key)
如果弱表的键是弱的,那么当键所引用的object被垃圾回收时,键值对也从弱表中移除