lua 面向对象

来源:互联网 发布:nodejs mysql 事务 编辑:程序博客网 时间:2024/06/14 05:17

Lua中的table就是一种对象,这句话可以从3个方面来证实。首先,table与对象一样可以拥有状态。其次,table也与对象一样拥有一个独立于其值的标示(self),最后,table

与对象一样具有独立于创建者和创建地的生命周期

对象有其自己的操作。同样 table 也有这些操作

Account = {balance = 0}

function Account.withdraw(v)

Account.balance = Account.balance -v

end


调用如下: Account.withdraw(100)

在函数中使用全局名称Account是不规范的,改进一下

function Account.withdraw(self,v)

self.balance = self.balance -v

end

调用:

a1 = Account; Account = nil

        a1.withdraw(a1,100) --OK

       还可以使用语法糖“:”

function Account:withdraw(v)

self.balance = self.balance -v

end

调用时可以写为

a:withdraw(100.00)

当然也可以a.withdraw(a,100.00)

也就是说用冒号就不用传self,用点需要传self

1.类

Lua中的类是用原型概念实现的,即,如果有两个对象a和b,要让b作为a的一个原型,只需要输入如下语句:

setmetatable(a,{__index = b})

在此之后,a就会在b中查找所有它没有的操作。若将b称为是对象a的类,只不过是术语上的变化

以银行账号的示例,就是使用__index元方法。可以应用一项小优化,则无需创建一个额外的table作为账户对象的元表。而是使用Account table自身作为元表:

function Account:new(o)

o = o or{}

setmetatable(o,self)

return o

end

此时调用:

a = Account:new{balance =0}

a:deposit(100.00)

当创建新账户时,a会将Account(Account::new 调用中的self)作为其元表.而当调用a:deposit(100.00)时,

就是调用了a.deposit(a,100).当Lua无法在table a 中找到条目deposit时,就会从__index里找

最终的调用情况为:

getmetatable(a).__index.deposit(a,100)

a的元表是Account,Account.--Index

0 0
原创粉丝点击