加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

【lua metatable、__index __newindex是什么】

发布时间:2020-12-14 22:04:54 所属栏目:大数据 来源:网络整理
导读:首先了解metatable是什么,给一个例子就知道大概了 span style="font-size:18px;"--定义2个表a = {5,6}b = {7,8}--用c来做Metatablec = {}--重定义加法操作c.__add = function(op1,op2) for _,item in ipairs(op2) do table.insert(op1,item) end return op1

首先了解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://www.voidcn.com/article/p-ppqiezcf-tm.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读