Lua _index、_newindex

_index元方法主要用于table的查询
table[key]的访问过程,首先检查table表中是否存在key的字段,如果有则返回,否则检查是否有_index的元方法,没有返回nil,有则查找元方法

_index元方法可以是不一定是一个函数,还可以是一个table。如果是一个函数,则以table和不存在的key作为参数返回该函数
例如:_index=function(t,key)
如果是一个table时,就以相同的方式来访问这个table(即传入key访问元方法的table,如果存在则返回值,反之返回nil)
例如:_index=tab 此时会返回tab[key]的值
_index可以很好的实现具有默认值的table

当访问一个table中不存在的字段时,得到的结果为nil。这些访问会促使解释器去查找一个叫__index的元方法。如果没有这个元方法,那么访问结果为nil。否则就由这个元方法来提供最终结果

将__index元方法用于继承是很普遍的方法,因此Lua还提供了一种更便捷的方式来实现此功能。__index元方法不必一定是一个函数,它还可以是一个table。当它是一个函数时,Lua以table和不存在的key作为参数来调用该函数

Window={} 
Window.prototype={x=0,y=0,width=100,height=100}
Window.mt={} --创建元表
--声明构造函数
function Window.new(o)
    setmetable(o,Window.mt)
    return o
end

--定义__index元方法
Window.mt.__index=function(table,key) return Window.prototype[key] end
同等于
Window.mt.__index=Window.mt.__index=Window.prototype

w=Window.new{x=10,y=20}
print(w.width) -->100

如果不想在访问一个table时涉及它的__index元方法,可以使用函数rawget。调用rawget(t,i)就是对table t 进行了一个“原始的(raw)”访问,也就是一次不考虑元表的简单访问。一次原始访问并不会加速代码执行,但有时会用到它

__newIndex元方法
__newindex用于table的更新
__index用于table的查询
当对一个table中不存在的索引赋值时,解释器就会查找__newindex元方法。如果有这个元方法,解释器就调用它,而不是执行赋值。如果这个元方法是一个table,解释器就在此table中执行赋值,而不是对原来的table。此外还有一个原始函数允许绕过元方法:调用rawget(t,k,v)就可以不涉及任何元方法而直接设置table t中与key k 相关联的value v

local mt={}
local mtTable={}
mt.__newindex=mtTable
local t={}
setmetatable(t,mt)

print(t.newkey,mt.newkey) --nil,nil

t.newkey="this is new value"

print(t.newkey,mtTable.newkey) --nil, this is new value
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值