【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 可以重载点运算符的查找: 
defaultFavs = {animal = 'gru', food = 'donuts'} 
myFavs = {food = 'pizza'} 
setmetatable(myFavs, {__index = defaultFavs}) 
eatenBy = myFavs.animal  -- 可以工作!这要感谢元表的支持

__newindex与__index相对应, 在对table的key做更新时触发. 可以使用rawset和rawget对table的key操作来跳过这些事件的触发. 还有一篇文章可以参考一下:http://blog.csdn.net/wangbin_jxust/article/details/12108189
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值