理解Lua中的__index和__newindex

代码如下:

--example: 
local temp_table ={ 
    10, 
    1, 
    Index1 = "hello", 
    Index2 = "world", 
    Index3 = "lua", 
    Index4 = "language", 
    lang = "lua language", 

 
temp_table.__add = function(a, b) return 3 end 
 
 
for _, Value in pairs(temp_table) do 
    print(Value) 
end 
 
local temp_metable_table = { 
    Index1 = "temp_new_metable_Index1", 
    Index2 = "temp_new_metable_Index2", 
    Key = "temp_new_metable_Key_end", 

 
 
for _, Metable_Value in pairs(temp_metable_table) do 
    print(Metable_Value) 
end 
--只能访问temp_table的方法 
--setmetatable(temp_metable_table,  temp_table) --如果setmetable 为这种方式的话,那么我不能够对metable进行原子操作 
--print(temp_metable_table + temp_table) 
 
--如果是这种方式的话,我们只能访问它的原子,也就是它的数据成员 
--[[setmetatable(temp_metable_table, {__index = temp_table} )  
 
print(temp_metable_table[1]) 
print(temp_metable_table["lang"])--]] 
 
--如果是__newindex的话,我们可以访问原table,找到相关的key,除此之外,你还可以自己给原table添加数据成员 
setmetatable(temp_metable_table, {__newindex = temp_table} )  
temp_metable_table[5] = 100 
print(temp_metable_table[5]) 
print(temp_table[5])

代码如下:

Window = {} 
 
Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,} 
Window.mt = {} 
function Window.new(o) 
    setmetatable(o ,Window.mt) 
    print(getmetatable(o)) 
    print(getmetatable(Window.mt)) 
    return o 
end 
 
Window.mt.__index = function (t ,key) //由于__index 给赋予了funcion,一个匿名函数 
    -- body 
    return 1000 
end 
 
w = Window.new({x = 10 ,y = 20}) 
print(w.a) //在这里虽然没有a这个成员,但是会默认a为__index所绑定的function返回值作为a的值

代码如下:

Window = {} 
Window.mt = {} 
 
function Window.new(o) 
    setmetatable(o ,Window.mt) 
    return o 
end 
Window.mt.__index = function (t ,key) 
    return 1000 
end 
Window.mt.__newindex = function (table ,key ,value) 
    if key == "wangbin" then 
        rawset(table ,"wangbin" ,"yes,i am") 
    end 
end 
w = Window.new{x = 10 ,y = 20} 
w.wangbin = "55" 
print(w.wangbin)

总结:
如果在元table中去找相应的操作,例如__index,__newindex等,如果有则直接访问,如果没有就新添加进元table中

(0)

相关推荐

  • Lua中的元方法__newindex详解

    好吧,我写文章的进度已经赶不上看书的进度了,简单的几段文字就够我唠叨一篇文章了. 今天继续来说说元方法,与__index有点相似的__newindex元方法. 1.查询与更新 上一篇文章我们介绍了__index元方法,总结来说,__index元方法是用于处理调用table中不存在的字段. 注意,[调用]这个词,只是调用,而不是赋值.   如果,我们要对table中某个不存在的字段赋值呢?(小若:就,直接赋值啊!) 没错,我们直接就能赋值了,不会报错的. 问题是,如果我想监控这个操作呢?如果有人想

  • Lua中的__index和__newindex实例

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

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

    因为不想在一篇文章里挤太多知识点,所以,有些小知识点就集合到这样的文章里吧~ 1.沉默技能--拒绝__index和__newindex效果 虽然__index和__newindex是很好用的功能,但是,有时候我们又希望很纯粹地去调用table或者给table赋值. 那,这时候怎么办?给table重新设置一个元表?不,这个做法很糟糕~ 于是,体贴的Lua又给我们提供了这样的调用方式,如下代码: 复制代码 代码如下: local smartMan = {         name = "none&q

  • 理解Lua中的__index和__newindex

    复制代码 代码如下: --example:  local temp_table ={      10,      1,      Index1 = "hello",      Index2 = "world",      Index3 = "lua",      Index4 = "language",      lang = "lua language",  }    temp_table.__add =

  • Lua中的__index方法详解

    当我们访问一个表的不存在的域,返回结果为nil,这是正确的,但并不一定正确.实际上,这种访问触发lua解释器去查找__index metamethod:如果不存在,返回结果为nil:如果存在则由__index metamethod返回结果. 这个例子的原型是一种继承.假设我们想创建一些表来描述窗口.每一个表必须描述窗口的一些参数,比如:位置,大小,颜色风格等等.所有的这些参数都有默认的值,当我们想要创建窗口的时候只需要给出非默认值的参数即可创建我们需要的窗口.第一种方法是,实现一个表的构造器,对

  • Lua中的元表与元方法学习总结

    前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了"+"符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行"+"操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数

  • Lua中设置table为只读属性的方法详解

    项目中部分只读表易被人误改写,故决定在非线上环境里对这些表附加只读属性,方便在出现误改写的时候抛出lua错误,最终版代码如下: --[[------------------------------------------------------------------------------ -** 设置table只读 出现改写会抛出lua error -- 用法 local cfg_proxy = read_only(cfg) retur cfg_proxy -- 增加了防重置设置read_o

  • Lua中实现面向对象的一种漂亮解决方案

    在 pil 中,lua 的作者推荐了一种方案来实现 OO,比较简洁,但是我依然觉得有些繁琐. 这里给出一种更漂亮一点的解决方案,见下文: 这里提供 Lua 中实现 OO 的一种方案: 复制代码 代码如下: local _class={}   function class(super)  local class_type={}  class_type.ctor=false  class_type.super=super  class_type.new=function(...)    local

  • Lua中的metatable详解

    Lua 中 metatable 是一个普通的 table,但其主要有以下几个功能: 1.定义算术操作符和关系操作符的行为 2.为 Lua 函数库提供支持 3.控制对 table 的访问 Metatables 定义操作符行为 Metatable 能够被用于定义算术操作符和关系操作符的行为.例如:Lua 尝试对两个 table 进行加操作时,它会按顺序检查这两个 table 中是否有一个存在 metatable 并且这个 metatable 是否存在 __add 域,如果 Lua 检查到了这个 __

  • Lua中的全局变量、非全局变量总结

    前言 Lua将其所有的全局变量保存在一个常规的table中,这个table称为"环境".这种组织结构的优点在于,其一,不需要再为全局变量创造一种新的数据结构,因此简化了Lua的内部实现:另一个优点是,可以像其他table一样操作这个table.为了便于实施这种操作,Lua将环境table自身保存在一个全局变量_G中.例如,我们可以使用以下代码打印当前环境中所有全局变量的名称. 复制代码 代码如下: for n in pairs(_G) do print(n) end 在你的电脑上运行一

随机推荐