【lua metatable、__index __newindex是什么】
首先了解metatable是什么,给一个例子就知道大概了 <span style="font-size:18px;">--定义2个表 a = {5,6} b = {7,8} --用c来做Metatable c = {} --重定义加法操作 c.__add = function(op1,op2) for _,item in ipairs(op2) do table.insert(op1,item) end return op1 end --将a的Metatable设置为c setmetatable(a,c) --d现在的样子是{5,6,7,8} d = a + b</span>我们的基本数据类型提供了一些操作运算,比如两个数字的加减乘除。但是表或是一些通过表来自定义的数据就没有 了这些操作,如何呢?C++中我们可以重载操作符。在乱里面也提供了类似的东东。及通过给表设置metatable来实 现。lua中我们可以用setmetatable和getmetatable来设置和获取一个表的metatable。具体使用读者自己百度一下就知道了。 读者参考一下:http://www.cnblogs.com/nepaul/archive/2011/08/18/2143936.html 还有一点,笔者不明白,下面的代码 val = {} print(type(val),getmetatable(val)) val = "" print(type(val),getmetatable(val)) val = 12 print(type(val),getmetatable(val)) val = false print(type(val),getmetatable(val)) val = function()end print(type(val),getmetatable(val))除了string类型的metatable不是nil,其他的数据类型都是nil。 除了__add,Metatable中还定义如下操作 add,sub,mul,div,mod,pow,unm,concat,len,eq,lt,le,tostring,gc,index,newindex,call等,可见我们的__index和__newindex只不过是metatable提供的内建特性。好了下面具体来说说。 Lua是个面向过程的语言,但通过Metatable可以模拟出面向对象的样子. 其关键就在于__index这个域. 他提供了表的索引值入口. 这很像重写C#中的索引器,当表要索引一个值时如table[key],Lua会首先在table本身中查找key的值,如果没有并且这个table存在一个带有__index属性的Metatable,则Lua会按照__index所定义的函数逻辑查找. 仔细想想,这不正为面向对象中的核心思想继承,提供了实现方式么. Lua中实现面向对象的方式非常多,但无论哪种都离不开__index. 《Programming In Lua》中一个例子来说明Lua实现OO思想的方式
local Bird = {CanFly = true} function Bird:New() local b = {} setmetatable(b,self) self.__index = self return b end local Ostrich = Bird:New() --Bird.CanFly is true,Ostrich.CanFly is true Ostrich.CanFly = false --Bird.CanFly is true,Ostrich.CanFly is false -- 元表的__index 可以重载点运算符的查找:? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |