LUA之面向对象

    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就好, 后面的就不研究了.

原文地址:https://www.cnblogs.com/Montauk/p/5457981.html