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

     
  • 相关阅读:
    初识HTML5
    java_类的有参方法
    示例:人机猜拳(请各位大佬看下)
    java-类和对象(笔记)
    Redis设计与实现——多机数据库的实现
    Redis设计与实现——独立功能的实现
    mina
    GUAVA-cache实现
    GUAVA-ListenableFuture实现回调
    Netty多协议开发
  • 原文地址:https://www.cnblogs.com/MrRightZhao/p/11301283.html
Copyright © 2011-2022 走看看