__newindex

前面说过__index,与__index不同的是,__newindex用于更新,而__index用于查找。当对一个table不存在的字段进行赋值时,就会查找__newindex元方法。如果存在这个元方法,就执行它。如果这个元方法是table,那么久对此table赋值,而不是原table。

window = {}
window.prototype = {x = 20, y = 30, width = 100, height = 200}
window.mt = {}
window.new = function(o)
   setmetatable(o,window.mt)
   return o
end

window.mt.__index = window.prototype
window.mt.__newindex = function(table,key,value)
     print("excu  __newindex....")
end

w = window.new{x= 50, y = 60}
print(rawget(w,w.width))   -->nil
w.xy = 40    -->excu  __newindex....

w中并不存在字段xy,因此执行__newindex方法

如果想对xy字段赋值,则修改__newindex方法如下:

mt.__newindex = function(table,key,v)

    rawset(t,key,v)
end

这里需要使用rawset,如果不这样,而进行直接赋值,则会陷入死循环,因为不存在xy字段就会一直查找。

时间: 2024-08-10 00:47:05

__newindex的相关文章

__newindex元方法

__index元方法是访问,如果表中没有就会进元方法查找(如果有元表的话),如果元方法是表,返回元表的元素:如果元方法是函数,则返回函数的返回值 __newindex元方法就是赋值,如果元表定义了这个元方法,那么新的键值就会保存在元方法指向的表中,如果元方法是函数,就会调用函数(会传入表,写入的键,写入的值) 例: 1. t= {} local mytable = setmetatable({k = "v"},{__newindex = t}) mytable[1] = 2 print

Lua语言基础汇总(9)-- Lua中__index和__newindex实践

前言 本文将通过几个简单的实例演示,巩固对__index和__newindex的理解,同时加深对Lua中元表和元方法的理解,如果对Lua的元表和元方法还不是很熟悉的话,请参考这篇文章:<Lua中的元表与元方法>. 具有默认值的table 我们都知道,table中的任何字段的默认值都是nil,但是通过元表,我们可以很容易的修改这一规定,代码如下: 1 2 3 4 5 6 7 8 9 function setDefault(tb, defaultValue)      local mt = {__

对lua中__newindex的理解

阅读了文章后用流程图来总结一下 __newindex的规则: a.如果__newindex是一个函数,则在给table不存在的字段赋值时,会调用这个函数.b.如果__newindex是一个table,则在给table不存在的字段赋值时,会直接给__newindex的table赋值. 应用: 1.__newindex是一个function时,可用来控制一个表中不存在的字段的赋值行为,例如当不希望子类覆盖父类方法或者修改父类成员时,可以对子类__newindex进行修改. 2.保护__index里面

利用__index和__newindex实现默认值表、监控表、只读表

__index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表. 带有默认值的表: setdefault = function(t, v) setmetatable(t, {__index = function () return v end}) end s = {1, 2, 3} setdefault(s, 0) -- 默认值设为0 print(s.x) 一般访问不存在的域会返回nil,但经过上

Lua的__index和__newindex之间的沉默与合作

本文转载于笨木头的博客,嘿嘿,向大神学习 这篇文章主要介绍了Lua中__index和__newindex之间的沉默与合作,本文着重讲解了__index和__newindex之间的联系,需要的朋友可以参考下 因为不想在一篇文章里挤太多知识点,所以,有些小知识点就集合到这样的文章里吧~ 1.沉默技能——拒绝__index和__newindex效果 虽然__index和__newindex是很好用的功能,但是,有时候我们又希望很纯粹地去调用table或者给table赋值. 那,这时候怎么办?给tabl

Lua语言中的__index,__newindex,rawget和rawset

转自:http://blog.csdn.net/wangbin_jxust/article/details/12108189 在谈及Lua中的__index,__newindex,rawget和rawset前,需要理解Lua中的元表这个概念. 零.元表的概念 对Lua中元表的解释: 元表可以改变表的行为模式. 这里举个例子: Window = {} Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,} Window.mt =

Lua强大的元方法__newindex

本文转载于笨木头的博客,嘿嘿,向大神学习 这篇文章主要介绍了Lua中的元方法__newindex详解,本文讲解了查询与更新.监控赋值.通过table给另一个table赋值等内容,需要的朋友可以参考下 好吧,我写文章的进度已经赶不上看书的进度了,简单的几段文字就够我唠叨一篇文章了. 今天继续来说说元方法,与__index有点相似的__newindex元方法. 1.查询与更新 上一篇文章我们介绍了__index元方法,总结来说,__index元方法是用于处理调用table中不存在的字段. 注意,[调

lua --- __newindex 的使用规则

1.如果 __newindex 是一个函数,在给 table 不存在的字段赋值的时候,会调用这个函数2.如果 __newindex 是一个table,在给 table 不存在的字段赋值的时候,会直接给 __newindex 的 table 赋值 测试用例: 1 local Song = {name = "南山南"}; 2 3 local mt = 4 { 5 __index = Song, 6 __newindex = function(table, key, val) 7 print

Lua学习

1.lua元表和元方法: __add(a, b) --加法 __index(a, b) --索引查询 __newindex(a, b, c) --索引更新(PS:不懂的话,后面会有讲) __call(a, ...) --执行方法调用 __tostring(a) --字符串输出 __metatable --保护元表 _index元方法: 是否还记得当我们访问一个table中不存在的字段时,会返回什么值?默认情况下,当我们访问一个table中不存在的字段时,得到的结果是nil.但是这种状况很容易被改