OpenResty学习笔记(八) lua高阶之面向对象编程
来源:互联网 发布:图像分水岭算法 编辑:程序博客网 时间:2024/05/20 16:43
在 Lua 中,我们可以使用表和函数实现面向对象。将函数和相关的数据放置于同一个表中就形成了一个对象。
请看文件名为 account.lua 的源码:
local _M = {}local mt = { __index = _M }function _M.deposit (self, v) self.balance = self.balance + vendfunction _M.withdraw (self, v) if self.balance > v then self.balance = self.balance - v else error("insufficient funds") endendfunction _M.new (self, balance) balance = balance or 0 return setmetatable({balance = balance}, mt)endreturn _M
引用代码示例:
local account = require("account")local a = account:new()a:deposit(100)local b = account:new()b:deposit(50)print(a.balance) --> output: 100print(b.balance) --> output: 50
上面这段代码 “setmetatable({balance = balance}, mt)”, 其中 mt 代表 { __index = _M } ,这句话值得注意。根据我们在元表这一章学到的知识,我们明白,setmetatable 将 _M 作为新建表的原型,所以在自己的表内找不到 ‘deposit’、’withdraw’ 这些方法和变量的时候,便会到 __index 所指定的 _M 类型中去寻找。
Lua是个面向过程的语言, 但通过Metatable可以模拟出面向对象的样子. 其关键就在于__index这个域. 他提供了表的索引值入口. 这很像重写C#中的索引器, 当表要索引一个值时如table[key], Lua会首先在table本身中查找key的值, 如果没有并且这个table存在一个带有__index属性的Metatable, 则Lua会按照__index所定义的函数逻辑查找. 仔细想想, 这不正为面向对象中的核心思想继承, 提供了实现方式么. Lua中实现面向对象的方式非常多, 但无论哪种都离不开__index。
0 0
- OpenResty学习笔记(八) lua高阶之面向对象编程
- OpenResty学习笔记(七) lua高阶之元表
- 八.面向对象编程---学习笔记
- Lua学习之6:面向对象编程
- Lua学习笔记之面向对象
- PHP学习笔记之PHP面向对象(八)
- Python学习笔记 6--高阶函数、面向对象编程
- Lua学习笔记:面向对象
- Lua学习笔记--面向对象
- Lua学习笔记 第十六章 面向对象编程
- 学习笔记之面向对象编程25(网络编程)
- Lua语言学习之面向对象的编程
- [学习笔记]python之面向对象编程
- JavaScript学习笔记之面向对象编程
- C++之面向对象编程学习笔记
- 《面向对象基础:C++实现》学习笔记之八
- Python学习笔记(八):面向对象编程、错误调试和测试(快速入门篇)
- python学习笔记(三)之面向对象编程
- React学习笔记(3)
- ffmpeg一揽子
- play_scala框架学习06 用户验证
- 十独吟 之二 冯小青
- Android 下 一些常用工具命令
- OpenResty学习笔记(八) lua高阶之面向对象编程
- 如何使用安卓Studio进行签名打包
- java synchronized详解
- maven命令
- Java按字节读写二进制文件
- 2016春季练习——博弈
- MySQL存储过程
- Android手记----TextView
- Java并发编程:Callable、Future和FutureTask