lua的元表与元方法

setmetatable()函数设置元表,getmetatable()函数获取元表

给一个table添加元表:

t = {}

t_metatable = {__index = {key = "value"}}

setmetatable(t, t_metatable)

这个有什么用呢?

t里面是没有key这个键的,像这样定义了元表的话(__index是元方法,表示索引,他可以是一个table,也可以是一个function,如果是table的话就在table中取值,如果是function的话值为返回值,如果未定义__index则为nil)

就会找到元表里面去

print(t.key)

输出:value

Lua查找一个表元素时的规则,其实就是如下3个步骤:

  • 1.在表中查找,如果找到,返回该元素,找不到则继续
  • 2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
  • 3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。

上面的描述表示元表是可以嵌套的:

__index为一个函数,Lua就会调用那个函数,table和键会作为参数传递给函数,最终键值为函数的返回值(键是直接传进去的,如果嵌套了多个元方法,则只能传入上一层的表)

--只会传入上一层的table
t = setmetatable({key = 1}, {__index = setmetatable({}, {__index = setmetatable({},{__index = function(t, key)
              if key == "key2" then
                return "abc"
              else
                return nil
              end
            end
            })})})
print(t.key2)

注意key可以传进去,但是table只能传上一层的。如果改为return t.key 的话返回为nil

但是如果这样的话:

t = setmetatable({key = 1}, {__index = setmetatable({}, {__index = setmetatable({key = 2},{__index = function(t, key)
              if key == "key2" then
                return t.key
              else
                return nil
              end
            end
            })})})
print(t.key2)

输出为 2

又如:

mytable = setmetatable({key1 = "value1"},{
    __index = function(mytable, key)
      if key == "key2" then
        return mytable.key1
      else
        return nil
      end
    end
  })
print(mytable.key1, mytable.key2)

这里打印都是value1,表示获取mytable成功。也即是说__index元方法会传入table和key。table只能传入上一层的

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

时间: 2024-08-07 22:30:56

lua的元表与元方法的相关文章

Lua 笔记--元表与元方法

可以通过元表来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作.当Lua试图将两个table相加时,它会先检查两者之一是否有元表,然后检查该原表中是否有一个叫__add的字段. Lua在创建新的table时不会创建元表,可以使用setmetatable来设置或修改任何table的元表. 在Lua中,只能设置table的元表,若要设置其他类型的值的元表,则必须通过C代码来完成.其他类型在默认情况下都没有元表. 1.算术类的元方法 Set = {} local mt = {} --

Lua 学习笔记(十一)元表与元方法

在Lua中的每个值都有一套预定义的操作集合.例如可以将数字相加,可以连接字符串,还可以在table中插入一对key-value等.但是我们无法将两个table相加,无法对函数作比较,也无法调用一个字符串. 但是,Lua提供了元表与元方法来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作.例如,假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时,它会先检查两者之一是否有元表,然后检查该元表中是否有一个叫__add的字段.如果找到了该

lua编程之元表与元方法

一. 前言 lua是一种非常轻量的动态类型语言,在1993年由由Roberto Ierusalimschy.Waldemar Celes 和 Luiz Henrique de Figueiredo等人发明,lua的设计目标是轻便地嵌入宿主语言,增强系统的可扩展性和可定制性.lua的源码只有两万余行,非常精简小巧,在目前的脚本引擎中,lua的速度是最快的,这也是lua进入程序设计语言前20名,如今已经广泛应用于游戏行业,这几篇文章将会讨论下lua的几个比较重要的特性. 一门语言的类型系统是其最根本

lua metatable和metamethod元表和元方法

Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时,它会先检查两者之一是否有元表,然后检查该元表中是否存在__add字段,如果有,就调用该字段对应的值.这个值就是所谓的“元方法”,这个函数用于计算table的和.    Lua中每个值都有一个元表.table和userdata可以有各自独立的元表,而其它数据类型的值则共享其类型所属的单一元表.缺省情况

Lua语言基础汇总(8) -- Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那本文就是主要讲的是如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接

[转]Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如果定义这个指定的函数,这个指定的函数时什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连

LUA Learning Note 6: 元表与元方法

--元表:是用来存放无方法的一个table. --table和userdata可以各种拥有独立的元表. 但是,其他类型的值就只能共享其类型所属的元表,比如,数字,所有的数字都共用一个元表. --元方法:用来进行table 类型变量进行特殊操作的一个方法. --Lua其实已经规定好了各种算术操作符的元方法名字:_add,_sub,_mul,_div,_unm,_mod,_pow. --使用步骤: -- 创建一个元表     local mt = {};     mt.__add = functio

第十三章 元表与元方法 Lua程序设计笔记

--第十三章 元表与元方法Lua中每个值都有一个表.table和userdata可以有各自独立的元表,其他类型的值共享一个元表.Lua中只能设置table的元表.若要设置其他类型的值的元表,则必须通过C代码来完成. --13.1算数类型的元方法 Set = {} local mt = {} --创建元表 function Set.new(l)--根据参数列表中的值创建一个新的集合 local set = {} setmetatable(set, mt) --设置元表 for _,v in ipa

Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连