Account = { balance=0, withdraw = function (self, v) self.balance = self.balance - v end } function Account:deposit (v) self.balance = self.balance + v end Account.deposit(Account, 200.00) Account:withdraw(100.00)
上面这个例子, 首先, Account是一个table, 里面两个元素, 一个是key为balance, value为0, 一个是一个key为withdraw, value是一个函数.
可以看得出:
1. 函数可以在table里面定义, 这个跟js很像.
2. self是LUA里面的this
3. 调用函数的方法是用.
4. 如果你想省略self当形参, 可以用冒号来定义跟使用这个函数.
另外, 下面这个例子说明LUA真的是OO:
Account = {balance = 0} function Account.withdraw (v) Account.balance = Account.balance - v end
a = Account; Account = nil a.withdraw(100.00) -- ERROR!
也就是说, 当一个变量指向另一个对象, 就无法再调用这个对象的有关原来这个对象的field了, 唯一的写法是用self, 也就是this, 把自己的field指向自己的field, 听起来好像哪里不对.
function Account.withdraw (self, v) self.balance = self.balance - v end
再调用:
a1 = Account; Account = nil ... a1.withdraw(a1, 100.00) -- OK
就OK了.
后面还有OO的继承, 封装, 实现接口, 这些并不是我关心的, 毕竟LUA实现OO在我看来就是扯淡, 我需要它处理一点str就好, 后面的就不研究了.