Metatable与面向对象、继承-创新互联
Lua是个面向过程的语言, 但通过Metatable可以模拟出面向对象的样子. 其关键就在于__index这个域. 他提供了表的索引值入口. 这很像重写C#中的索引器, 当表要索引一个值时如table[key], Lua会首先在table本身中查找key的值, 如果没有并且这个table存在一个带有__index属性的Metatable, 则Lua会按照__index所定义的函数逻辑查找. 仔细想想, 这不正为面向对象中的核心思想继承, 提供了实现方式么. Lua中实现面向对象的方式非常多, 但无论哪种都离不开__index.
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、虚拟空间、营销软件、网站建设、崇仁网站维护、网站推广。local bb = {cancry = true} function bb:new() b = {} self.__index = self--改变自己的索引值入口 setmetatable(b, self)--将b的索引值入口设成self,即(local bb = {cancry = true}) return b end local ostrich = bb:new() print(ostrich.cancry)
另外一个教程:
Person={} function Person:new(p) local obj = p if (obj == nil) then obj = {name="ChenHao", age=37, handsome=true} end self.__index = self--是怕self被扩展后改写,所以,让其保持原样 return setmetatable(obj, self)--返回第一个参数 end function Person:toString() return self.name .." : ".. self.age .." : ".. (self.handsome and "handsome" or "ugly") end
上面我们可以看到有一个new方法和一个toString的方法。其中:
1)self 就是 Person,Person:new(p),相当于Person.new(self, p)
2)new方法的self.__index = self 的意图是怕self被扩展后改写,所以,让其保持原样
3)setmetatable这个函数返回的是第一个参数的值。
于是:我们可以这样调用:
me = Person:new() print(me:toString()) kf = Person:new{name="King's fucking", age=70, handsome=false} print(kf:toString())
继承:
Student = Person:new() function Student:new() newObj = {year = 2013} self.__index = self return setmetatable(newObj, self) end function Student:toString() return "Student : ".. self.year.." : " .. self.name end
student = Student:new() print(student:toString())
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前文章:Metatable与面向对象、继承-创新互联
文章位置:http://hbruida.cn/article/csidei.html