• Lua中元表的学习


    --table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作。
    --元表(Metatable),允许我们改变table的行为,可以对两个table进行操作
    --有两个很重要的函数来处理元表:
    --setmetatable(table,metatable): 对指定table设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable会失败。
    --getmetatable(table): 返回对象的元表(metatable)
    mytable = {}
    mymetatable = {}
    setmetatable(mytable,mymetatable)
    getmetatable(mytable);
    
    other = {foo = 2}
    t = setmetatable({},{__index = other})
    print(t.foo) 
    print(t.bar)
    --[[
    运行结果:
    2
    nil
    --]]
    
    
    
    
    
    --Lua查找一个表元素时的规则,其实就是如下3个步骤:
    --1.在表中查找,如果找到,返回该元素,找不到则继续
    --2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
    --3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。
    lgstable = setmetatable({key1 = "value1"},
        {
            __index = function(lgstable,key)
                if "key2" == key then
                    return "metatablevalue"
                else
                    return nil
                end
            end
        })
    
    print(lgstable.key1,lgstable.key2)
    --运行结果:value1    metatablevalue
    --以上代码等价于一下代码
    lgstable = setmetatable({key1 = "value1"},
        {
        __index = {key2 = "metatablevalue"}
        })
    print(lgstable.key1,lgstable.key2)
    
    
    
    
    
    
    --__index元方法用来对元表进行访问,__newindex元方法用来对表更新
    --当你给表的一个缺少的索引赋值,
    --解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。
    mymetatable = {}
    mytable = setmetatable({key1 = "value1"},{__newindex = mymetatable})
    
    print(mytable.key1)
    
    mytable.newkey = "newkey1"
    print(mytable.newkey,mymetatable.newkey)
    --结果:nil    newkey1
    
    mytable.key1 = "newkey1"
    print(mytable.key1,mymetatable.key1)
    --结果:newkey1    nil
    
    --以上实例中表设置了元方法 __newindex,在对新索引键(newkey)赋值时(mytable.newkey = "新值2"),会调用元方法,而不进行赋值。
    --而如果对已存在的索引键(key1),则会进行赋值,而不调用元方法 __newindex。

    参考:http://www.runoob.com/lua/lua-metatables.html

    码云上的相关工程:https://gitee.com/luguoshuai/LearnLua

  • 相关阅读:
    15、SQL基础整理(视图)
    14、SQL基础整理(存储过程)
    13、SQL基础整理(流程控制begin……end)
    12、SQL基础整理(运算符与优先级)
    11、SQL基础整理(变量)
    10、SQL基础整理(约束2)
    9、SQL基础整理(两表连接exists,join on,union)*Oracleも含む(INTERSECT&MINUS)
    20141113--SQL 事务
    20141111--SQL触发器
    20141110--SQL视图
  • 原文地址:https://www.cnblogs.com/luguoshuai/p/9222199.html
Copyright © 2020-2023  润新知