• lua 元表Metatable (六)


    元表理解起来比较抽象,但这是lua设置的一种数据结构而已, 假设有table_A、table_B 这2个table,如果table_A要操作table_B,显然是不可能的 
    因为者都之间是没有关系的,如果把table_B设置成了table_A 的元表,那么table_A就可以操作table_B里面的元素,甚至可以对2个table里面的元
    素进行运算操作元表的
    设置语法:setmetatable(table_A,table_B) 
    元表里面有以下元方法: 
     1.__index --- 该方法主要是用来对表访问。 
       通过它来设置metatable的键,table通过这个键来获取metatable中的值 
     2.__newIndex --- 该方法主要是对表更新。 
       当给一个表中的索引赋值时,解释器就会调用查找__newIndex方法,如果存在则调用进行赋值操作
    mytable = {}; -- 普通表
    mymetatable = {__metatable="hi"}; -- 元表
    setmetatable(mytable,mymetatable); -- 把mymetatable 设置成mytable的元表
    mytable = setmetatable({},{}); -- 也可以写成这样
    getmetatable(mytable); -- 返回mymetatable
    
    -- __index 作为键时
    
    local table_A = { k1 = "Hello"}
    local table_B = {k2 = "world"}
    setmetatable(table_A,{ __index = table_B })
    print(table_A.k1)
    print(table_A.k2)
    
    -- __index 是函数时
    
    function fun1(table,key)
    print(table,"
    ",key)
      return "hello"
    end
    local table_A = { k1 = "world"}
    
    setmetatable(table_A,{ __index = fun1 }) -- 会将table_A 和k1作为参数传递给fun1
    print(table_A.k2)
    
    
    
    --- Lua 查找一个表元素时的规则,其实就是如下 3 个步骤:
    --- 1.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;
    --- 如果 __index 方法是一个表则返回一个表,按2.3步骤查找
    --- 2.在表中查找,如果找到,返回该元素,找不到则继续
    --- 3.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。

    --- 2.__newindex作为键时


    local table_A = { k1 = "hi"}
    local table_B = {}

    
    

    table_A = setmetatable(table_A,{__newindex = table_B})
    table_A.k1 = "hihi"
    table_A.k2 = "haha"
    print("修改后的是:",table_A.k1,table_A.k2,table_B.k2)

    
    

    -- __newindex为函数是

    function fun4(table,key,value)
    print(table," ",key,value)
    end
    local table_A = {k1 = "hi"}

    
    

    setmetatable(table_A,{__newindex = fun4 })

    
    

    table_A.k2 = "Good"

     
  • 相关阅读:
    Jenkins 基础篇
    Jenkins 基础篇
    Windows配置Nodejs环境
    Windows配置安装JDK
    Windows安装MySQL
    Ubuntu安装MySQL
    利用中国移动合彩云实现360云盘迁移到百度云
    Linux Shell下的后台运行及其前台的转换
    nova image-list 和 glance image-list 有什么区别
    启动虚拟机时提示我已移动或我已复制选项的详解
  • 原文地址:https://www.cnblogs.com/MrRightZhao/p/11301283.html
Copyright © 2020-2023  润新知