摘要: Lua中的垃圾回收主要是针对Lua对象,但是也可以做一些额外的资源管理工作。 可以为表设定垃圾收集的元方法(对于完全用户数据,则需要使用C API),该元方法称为 终结器。 Lua用"__gc" 元方法实现终结器: 如果我们没有对对象进行__gc标记,它就不会终结。 在它之后才给元表加上这个__gc 阅读全文
posted @ 2016-09-19 20:00 daiker 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 对象属性 有很多情况需要把有些属性绑定到某个对象,例如:函数与其名称、table的默认值、数组大小等... 当对象是一个table时,可以通过适当的key将属性存储在这个table中。 如果对象不是一个table,它就无法保存属性了。 另外,即使是table,有时也不想将属性存储在原table中。可 阅读全文
posted @ 2016-09-19 17:47 daiker 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 一项通用的编程技术:用空间换时间。 例如有一种做法就可以提高一些函数的运行速度,记录下函数计算的结果,当再次调用该函数时,便可以复用之前的结果。 比如,一个普通服务器,在它收到请求中包含Lua代码,会loadstring,编译出新函数。为了避免反复loadstring,用一个辅助table保存编译结 阅读全文
posted @ 2016-09-19 16:13 daiker 阅读(161) 评论(0) 推荐(0) 编辑
摘要: Lua采用了自动内存管理。所以不用担心新创建的对象需要的内存如何分配出来,也不用考虑对象不再被使用后怎样释放它们所占用的内存。 Lua实现了一个增量标记-扫描收集器。它使用这两个数字来控制垃圾收集循环:垃圾收集器间歇率 和 垃圾收集器步进倍率。 这两个数字都使用百分数为单位(例如:100在内部表示1 阅读全文
posted @ 2016-09-19 11:29 daiker 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 当一个对象只有一个方法时,可以不用创建接口table,但是要将这个单独的方法作为对象来返回。可以参考迭代器那一节,是如何构造一个迭代器函数,那个函数将状态保存为closure。 一个具有状态的迭代器是一个单一方法对象。 单一方法对象还有一种情况,若这个方法是一个调度(dispatch)方法,它根据某 阅读全文
posted @ 2016-09-19 09:18 daiker 阅读(125) 评论(0) 推荐(0) 编辑
摘要: 在Lua面向对象编程的基础设计当中,没有提供私密性机制。但是可以用其他方法实现,从而获得对象的访问控制。 这种实现不常用,作为兴趣爱好,只做基本了解。 基本做法是:通过两个table来表示一个对象。一个用来保存状态,一个用于操作(或称为接口)。 为了避免未授权的访问,表示状态的table不保存在其他 阅读全文
posted @ 2016-09-18 19:29 daiker 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 在Lua中进行面向对象编程时有几种方法,上一小结介绍了一种使用__index元方法的做法。 下面要介绍另一种方法,可以在Lua中实现多继承. 关键一点,在于用函数作为__index元字段。 多重继承意味着一个类可以有多个基类。因此无法使用一个类中的方法来创建子类,而是需要定义一个特殊的函数来创建。 阅读全文
posted @ 2016-09-18 18:55 daiker 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 类也是对象,所有它们也可以从其他类获得方法。这就是“继承”,可以在Lua中表示: 如果想从这个类中派生一个子类,以使客户能够透支。则先需要创建一个空的类,从基类继承所有的操作: SpecialAccount就是一个Account的实例。如下所示: SpecialAccount从Account继承了n 阅读全文
posted @ 2016-09-18 18:10 daiker 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 一个类就是一个创建对象的模具。对于一些基于原型的语言,对象是没有“类型”的,而是每个对象都有一个原型(prototype). 原型也是一种常规的对象。当其他对象(类的实例)遇到一个未知操作时,原型会先查找它。这种语言要创建一个类,只需要创建一个专用作其他对象的原型。 类和原型都是一种组织对象间共享行 阅读全文
posted @ 2016-09-18 17:34 daiker 阅读(125) 评论(0) 推荐(0) 编辑
摘要: Lua中的table就是一种对象。 1、table和对象一样拥有状态 2、和对象一样有一个独立的标识符(a self) 3、和对象一样,具有独立于创建者和创建地的生命周期。 对象有他们自己的操作,table同样也有: 有了上面的定义,可以这样调用: 这种函数就是所谓的“方法(Method)”,不过在 阅读全文
posted @ 2016-09-18 14:42 daiker 阅读(126) 评论(0) 推荐(0) 编辑