lua package 面向对象开发
lua 作为一门简单的语言,在变量是只有 table 和非 table 的区别。
基本
1 | local _M = {} |
在 lua 中 _M:foo() 就是 _M.foo(self) 。在使用时和个人习惯有关。这里我希望能够严格的区分库和对象.当函数为静态方法时,比如一些utils函数,使用点号(.)。当函数需要面向对象时,使用冒号(:)。
功能扩展
有时候我们需要对现有的库添加新的函数, 比如对 json 库做扩展。
1 | local json = require("cjson.safe") |
面向对象
1 | local _M = {} |
mt 为原始对象,使用 setmetatable 来实现参数的初始化。
metatable
lua 的面向对象编程中有一个中重要的概念 metatable (元表)。
任何 table 都可以附加元表
setmetatable() 用来将一个表附给另一个表做元表, 该函数总是返回第一个参数
元表里可以包含任何东西,常用的索引是 __index
和 __newindex
索引对应的值可以是表或者函数
在 lua 中,可以通过元表来对某个对象进行扩展,这也是 lua 面向对象开发的基础。
lua package 面向对象开发