①Lua的面向对象实现是通过各种语法糖来实现的,function t:a(…)会被转换为t.a=function(self,…),而t:a(…)会被翻译为t.a(t,…)。同时t.a又会被翻译成t[“a”],所以绕来绕去底层实现还是table;
②Lua的类的构造函数形式一般为class:new(…),当调用时就class就会传入形参self,因此需要新建一个table并且把它的元表设置为self(也就是class),并且为这个元表添加__index属性(值设置为它本身),这样返回的table(实例)在找不到元素的情况下就会去找metatable的__index(类)。同样的原理可以实现父类和子类之间的关系;
③关于闭包,lua的函数作为第一类值,跟传统类型的变量没有区别,甚至还有特定的词法域,即一个函数可以嵌套在另一个函数中,内部的函数可以访问到外部函数中的变量。看起来外层函数已经退出,它的局部变量应该会被销毁,但Lua会把它加以保存起来并和内层函数绑定起来,称之为闭包。每调用一次外层函数就会生成一个新的闭包,不同闭包的外部局部变量是相互独立的;