zoukankan      html  css  js  c++  java
  • lua 元方法 __index

    原方法 __index:

    作用用于访问元表中的内容。即当通过键来访问table时,如果这个键没有值,则lua会寻找该table中的 metatable 中的__index键。如果__index指向的是一个able,则lua会在__index指向的table中查找相应的键

    Lua 查找一个元表的规则:

    1、在表中查找,如果找到,则返回该键指向的值。如果找不到则继续

    2、判断该表是否存在元表,如果没有,则返回nil。 如果有元表则继续

    3、判断元表中是否存在__index 方法,如果 __index不存在则返回nil。如果__index 方法是一个table,则重复1、2、3. 如果__index 方法是一个函数,则返回该函数的值

    1 -- 如果键值不存在则返回 0
    2 mtb = setmetatable({},{__index=function(mtable,key)
    3         return 0
    4     end
    5 })


    -- 获取指定键的值,如果不存在该键则创建改建并赋给默认值0
    mtb = setmetatable({},{__index=function(mtable,key)
            print("I'm here")
            rawset(mtable,key,0)
        end
    })
    
    print(mtb.key)
    print(mtb.key)

    原方法 __newindex:

    与 __index 不同的是,__newindex 是用来对表进行更新的。

    当对表不存在的一个key(索引)赋值时,解释器会查找 __newindex 元方法;如果存在则调用这个函数而不进行赋值操作。

    -- 对一个表的键进行赋值,如果不存在该键值则插入键并且赋给用户指定的值
    tb = setmetatable({}, {__newindex=function(bb,key,value )
        rawset(bb,key,value)
    end})
    元方法 说明
    __add 对应运算符“+”
    __sub 对应运算符“-”
    __mul 对应运算符“*”
    __div 对应运算符“/"
    __mod 对应运算符"%"
    __unm 对应运算符"-"
    __concat 对应运算符".."
    __eq 对应运算符"=="
    __lt 对应运算符"<"
    __le 对应运算符"<="

    这里的原方法与 C++中的运算符重载类似,不过在lua里面原方法的使用更加灵活

    其他方法:

    __call :当元组调用一个值时,进行调用

    __tostring:  类似与 C# 中的 ToString 方法,用于改变元组输出的行为

  • 相关阅读:
    Oracle SQL语句大全(一)
    数据查询(3)-复杂查询(芮)
    数据查询(2)-高级查询(芮)
    数据查询(1)-简单查询(芮)
    T-SQL(5)-操作数据行(芮)
    T-SQL(4)-功能函数(芮)
    T-SQL(3)-批处理(芮)
    T-SQL(2)-逻辑控制(芮)
    T-SQL(1)-变量(芮)
    如何设计数据库(2)?(芮)
  • 原文地址:https://www.cnblogs.com/pmsl/p/7419765.html
Copyright © 2011-2022 走看看