lua元表

作者: 岛在深海处 | 来源:发表于2018-05-19 13:58 被阅读0次
1、Lua 元表(Metatable)
  • setmetatable(table,metatable): 对指定table设置元表(metatable),返回普通表(table),如果元表(metatable)中存在__metatable键值,setmetatable会失败 。
  • getmetatable(table): 返回对象的元表(metatable)。
__index 元方法 (使普通表能够对元表进行访问)

__index元方法为metatable 最常用的键。当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
注意再lua中table的键对应的值可以为任何类型包括函数,所以__index也可以是一个函数。

如下例子可帮助理解__index元方法以及getmetatable()方法的使用。

table1 = {key1 = "bbg"}
--这里返回的table即为前面定义的table1
mytable = setmetatable(table1, {__index={key2="hello"}})
print(mytable.key2)    --hello

--这里返回的table即为前面设置的{{__index={key2="hello"}}}
metable = getmetatable(table1)  
print(metable.__index.key2)     --hello
__newindex 元方法(使普通表能对元表进行更新,普通表本身不会被更新)

元表设置了元方法 __newindex,在对新索引键(newkey)赋值时(mytable.key2 = "新值2"),会调用元方法__newindex,而不进行赋值。而如果对已存在的索引键(key1),则会进行赋值,而不调用元方法 __newindex。

table1 = {key1 = "kkk"}
metatable = {}
mytable = setmetatable(table1, {__newindex = metatable})
mytable.key2 = "新值2"
print(mytable.key2)   --nil
print(metatable.key2)   --新值2

mytable.key1 = "bbb"
print(mytable.key1)    --bbb
print(metatable.key1)   --nil
为表添加操作符 (类似于Java中对方法的重写)
table1 = {1, 2, 3}
mytable = setmetatable(table1, {
    __add = function(table1, newtable)
        for k, v in ipairs(newtable) do
            table.insert(mytable, v)
        end
        return mytable
    end
    })

secondtable = {4,5,6}
sumtable = mytable + secondtable
print("sumtalbe.len = ", #sumtable)  --6
for k, v in ipairs(sumtable) do
    print(v)
end

对应运算符列表如下:
__add 对应的运算符 '+'.
__sub 对应的运算符 '-'.
__mul 对应的运算符 '*'.
__div 对应的运算符 '/'.
__mod 对应的运算符 '%'.
__unm 对应的运算符 '-'.
__concat 对应的运算符 '..'.
__eq 对应的运算符 '=='.
__lt 对应的运算符 '<'.
__le 对应的运算符 '<='.

__call 元方法
__tostring 元方法

相关文章

  • Lua中元表的学习

    Lua本身没有面向对象的思想,但是可以根据表、元表、元方法来靠近它 一、元表与元方法的概念Lua中每个值都可具有元...

  • Lua 元表(Metatable)

    学习网站Lua 元表(Metatable)

  • Lua 实现面向对象 (原创)

    要理解Lua是如何实现面向对象的。首先要熟悉Lua元表的相关知识,可以阅读我上一篇文章《Lua元表 (Metata...

  • Lua学习

    Lua 学习 元表 setmetatable(table,metatable): 对指定table设置元表(met...

  • 2017.5.26

    lua学习:metatable 元方法,元表 lua 中的任何一个值都有其预定义的一套操作,这些操作都是在元表中定...

  • Lua元表

    Lua元表 在Lua中,我们可以通过key找到对应的value值,但是无法对两个table进行操作。 在Lua中为...

  • Lua元表

    @date: 2018-3-18 在Lua5.1语言中,元表 (metatable) 的表现行为类似于 C++ 语...

  • lua元表

    1、Lua 元表(Metatable) setmetatable(table,metatable): 对指定tab...

  • Lua 元表

    有一篇博客对Lua元表的介绍非常易懂,推荐阅读原博主的文章 点我前往 以下内容仅仅是个人为了加深记忆将原博主内容消...

  • 学习常用链接

    //Lua Lua table详解 Lua 元表详解 云风博客 //Unity Unity知识点 栈和队列 Uni...

网友评论

      本文标题:lua元表

      本文链接:https://www.haomeiwen.com/subject/urtzixtx.html