Lua语言层面是不支持面向对象的,所以需要使用者自己实现
Lua成员函数的定义可以使用.(点)或者:(冒号),函数调用也是两个符号都可以使用,区别如下:
data = {} -- 内部环境没有self function data.f1(a,b,c) print('--------------------') print(a) print(b) print(c) print('--------------------') end -- 内部环境有self(虽然没有出现在参数列表中) function data:f2(a,b,c) print('--------------------') print(self) print(a) print(b) print(c) print('--------------------') end -- 调用方式和定义方式保持一致就是可以的 data.f1(1,2,3) -- 没有self,像是静态函数 data:f2(1,2,3) -- 有self,像是普通成员函数 data.f2(1,2,3) -- 参数错位:少传递了一个self,参数不够,第一个参数当了self -- 但这种还是可以挽救的,手动多传递一个self就行 data.f2(data,1,2,3) -- 手动将对象data放在参数列表里面,这时定义和调用的参数列表是不一样的 data:f1(1,2,3) -- 参数错位:多了一个self,第三个参数没用
输出: -------------------- 1 2 3 -------------------- -------------------- table: 0000000000e39560 1 2 3 -------------------- -------------------- 1 2 3 nil -------------------- -------------------- table: 0000000000e39560 1 2 3 -------------------- -------------------- table: 0000000000e39560 1 2 --------------------
以上是直接创建一个Table,创建的Table就是实例
如果先创建一个类,从这个类实例化出对象?
类如何继承?
--- ---闭包绑定lua函数 ---@param self table ---@param func function Bind = function(self,func) if self == nil then return function(...) return func(...) end else return function(...) return func(self,...) end end end