lua的面向对象
来源:互联网 发布:小猪cms源码2017 编辑:程序博客网 时间:2024/04/27 01:06
本文解释面向对象的一个例子,例子来源于http://www.lua.org/pil/16.2.html
文件UIBase.lua
module("UIBase", package.seeall) Account = {balance = 0} function Account:new (o) --self = Account o = o or {} setmetatable(o, self) self.__index = self return o end function Account:deposit (v) self.balance = self.balance + v end function Account:withdraw (v) if v > self.balance then error"insufficient funds" end self.balance = self.balance - v end
文件luastudy.lua
package.path = package.path .. ';E:\\testProject\\lua\\?.lua'function printTable(t) local strk = ""; local strv = ""; for i,v in pairs(t) do strk = strk .. tostring(i) .. ' ' strv = strv .. tostring(v) .. ' ' end print('------------begin------------') print('table ' .. tostring(t)) print('key ' .. strk) print('value ' .. strv) print('-------------end-----------')endrequire 'UIBase'local Account = UIBase.AccountprintTable(Account) SpecialAccount = Account:new()printTable(Account)printTable(SpecialAccount)--s = Account.new(SpecialAccount)--s.limit = 1000 s = SpecialAccount:new({limit=1000.00}) printTable(SpecialAccount) print(s.limit) s.deposit(s,100.00) print(s.balance)
输出为:
那么问题来了
问题1:输出的第一个表跟第二个表不一样,为什么?
不一样是因为这句 SpecialAccount = Account:new(),实质是执行了代码:
SpecialAccount = Account.new(Account)
在函数里面,self指的是Account,在函数里面有Account.__index=self.这句话导致了Account有了变化
问题2:输出的第一个表跟第二个表地址不变,为什么输出的第三个表跟第四个表地址变了?
第三个表是Account的new函数生成的,参数为空,返回的是新建的表。
第四个表示SpecialAccount的new函数生成的,参数为表{limit=1000.00},返回的是传入的参数表。
问题3:为什么s.deposit(s,100.00)能正确执行?
s是一个表,s的元表是SpecialAccount,这个通过s = SpecialAccount:new({limit=1000.00})可以看出来。
SpecialAccount的元表是Account,这个通过 SpecialAccount = Account:new()可以看出来
s没有deposit,就在s的元表SpecialAccount里面找,没找到就在SpecialAccount的元表Account里面找,找到了,就执行Account的deposit
0 0
- Lua的面向对象
- lua的面向对象
- 面向对象的lua
- Lua的面向对象
- [Lua]Lua的面向对象程序设计
- Lua面向对象的实现
- Lua 面向对象的原理
- lua的面向对象实现
- Lua的面向对象封装
- lua实现面向对象的特性
- lua实现面向对象的特性
- lua实现面向对象的特性
- lua实现面向对象的特性
- lua 的面向对象化编程
- Lua语言中面向对象的实现
- lua面向对象是怎么实现的
- 基于closure的lua面向对象编程
- lua 类 面向对象的用法
- 300个国外优秀网站
- 九章算法面试题33 数组波峰
- 执行SVN up和svn merge等命令出现在首位置的各字母含义以及SVN合并别人的修改
- 利用堆栈进行四则运算
- [LeetCode] Pascal's Triangle II
- lua的面向对象
- 登录远程仓库并创建自己的工程
- 最佳情人
- spring3 的restful API RequestMapping介绍
- maven SpringMVC4 JPA 开发环境的搭建
- 提高项目经理软实力
- 神回复吧102条简短深刻的回答,看完人生豁然开朗
- 32岁大叔的转行之路!
- 奇怪的Windows Phone入门开发日志