lua package 面向对象开发

lua 作为一门简单的语言,在变量是只有 table 和非 table 的区别。

基本

1
2
3
4
5
6
local _M = {} 
function _M:foo()
...
end

return _M

在 lua 中 _M:foo() 就是 _M.foo(self) 。在使用时和个人习惯有关。这里我希望能够严格的区分库和对象.当函数为静态方法时,比如一些utils函数,使用点号(.)。当函数需要面向对象时,使用冒号(:)。

功能扩展

有时候我们需要对现有的库添加新的函数, 比如对 json 库做扩展。

1
2
3
4
5
6
7
8
9
10
local json = require("cjson.safe")
local _M = {}

setmetatable(_M,{ __index=json })

function _M:xxxx()
...
end

return _M

面向对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
local _M = {}

local mt = {__index= _M}

function _M:new(var_a,var_b)

return setmetatable({
var_a = var_a,
var_b = var_b
},mt)

end
function _M:foo()
return self.var_a..self.var_b
end

return _M

mt 为原始对象,使用 setmetatable 来实现参数的初始化。

metatable

lua 的面向对象编程中有一个中重要的概念 metatable (元表)。

任何 table 都可以附加元表

setmetatable() 用来将一个表附给另一个表做元表, 该函数总是返回第一个参数

元表里可以包含任何东西,常用的索引是 __index__newindex

索引对应的值可以是表或者函数

在 lua 中,可以通过元表来对某个对象进行扩展,这也是 lua 面向对象开发的基础。

lua package 面向对象开发

https://beixiu.net/dev/lua-package-扩展/

作者

张巍

发布于

2021-11-30

更新于

2022-04-22

许可协议

评论