zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    sql-DDL, DML 常用语句
    7.8 Structured Streaming
    7.7 输出操作
    7.6 转换操作
    7.5 高级数据源---Kafka
    7.4 基本输入源
    7.3 DStream操作
    7.2 Spark Streaming
    7.1 流计算概述
    6.3 使用Spark SQL读写数据库
  • 原文地址:https://www.cnblogs.com/luguoshuai/p/9222199.html
Copyright © 2011-2022 走看看