`

Lua学习(六)元表和元方法

    博客分类:
  • lua
 
阅读更多
  可以通过一个元表修改一个值的行为,使其在面对一个非预定义操作时执行一个指定操作
元表:metatable

元方法:metemethod
__add        --加法
__mul        --乘法
__sub        --减法
__div        --除法
__unm        --相反数
__mod        --取模
__pow        --乘幂
__concat     --字符串连接

__eq         --相等
__lt         --小于
__le         --小于等于

__index      --如果读取table中不存在的索引的值时,执行该元方法
__newindex   --如果对table不存在的索引赋值,执行该元方法



示例一:算术类的元方法
--创建元表:
local tuple_mt = {}

--元方法:生成新表
function tuple_mt.new(t)
    setmetatable(t, tuple_mt)     --将mt设为t的元表
    return t
end

--元方法:将t1和t2执行对应操作
function tuple_mt.__add(t1, t2)
    ret = {}
    ret.addends = t1.addends + t2.addends
    ret.multi = t1.multi * t2.multi
    return ret
end

--测试用例:
ta = tuple_mt.new{addends=2, multi = 2}
tb = tuple_mt.new{addends=3, multi = 3}
tc = ta + tb
for i,v in pairs(tc) do
    print(i,v)        
end
---最后输出结果
addends 5
multi   6


示例二:__index元方法:当试图访问table中不存在的索引时,如果找到__index元方法,那么执行这个元方法,找不到就返回nil值
local mt = {}
local key = {}        --将一个table设为唯一的key
function mt.__index(t)
    return t[key]
end

function setDefaul(t, DefaultVal) 
    t[key] = DefaultVal      --将默认值保存到原数组中,这样,不同默认值的table可以共用一个元表mt
    setmetatable(t, mt)
end

tab = {"Mday", "Tday", "Wday"}
setDefault(tab, "Noday")
print(tab[1],tab[8])        --输出结果:Mday,Noday
    


示例三:__newindex元方法:试图给table不能存在索引赋值是,查找__newindex方法,如果有__newindex方法,就执行
local mt = {}
local index = {}             --创建私有索引

function mt.__index(t,k)
    print("visit element  " .. tostring(k))
    return t[index][k]
end

function mt.__newindex(t,k,v)
   print("set element  " .. tostring(k).." to "..tostring(v))
   t[index][key] = v
end

function trace(t)   
    local proxy = {}
    proxy[index] = t
    setmetatable(proxy, mt)
    return proxy
end

tab = trace({})
tab[2] = "hello world"
print(tab[2])
   


示例四:只读表
function setReadOnly(t)
    local mt = {}
    local proxy = {}

    mt.__index = t

    function mt.__newindex(t,k,v)
       error("deny to modify", 2)
    end

   setmetatable(proxy, mt) 
   return proxy
end

days = setReadyOnly{"Mday", "Tday", Wday"}
print(days[1]
days[9] = "NiceDay"

分享到:
评论

相关推荐

    Lua程序设计,2~4版本pdf电子书,C的Lua语言原滋原味

    第三版和第四版在此基础上进行了优化和扩展,增强了对元表和元方法的支持,使得面向对象编程更加灵活。 第二部分:Lua中的表与面向对象编程 在Lua中,table是所有数据结构的基础,它既可以用作数组,也可以用作哈希...

    lua基础学习笔记

    当通过键访问表时,如果没有找到对应的值,Lua会根据元表中的 `__index` 键来进行进一步的操作: - 如果 `__index` 是一个表,Lua将在该表中查找相应的键。 - 如果 `__index` 是一个函数,Lua将调用该函数,并将原表...

    lua中文手册lua-5.3-zh-manual.pdf

    Lua是一种动态类型语言,其值可以是六种基本类型之一:nil、boolean、number、string、userdata和function,以及两种复合类型:table和thread(协程)。不同类型的值在Lua中有不同的表示方式和行为。 2. 环境和全局...

    lua与Android交互,基本实现

    在Android开发中,有时我们需要使用脚本语言来增强应用的灵活性和可扩展性,而Lua就是这样一种轻量级、高效且易于学习的脚本语言。本文将深入探讨如何在Android应用中集成Lua,并实现Android与Lua之间的交互。 一、...

    lua api lua文档

    ### Lua API及Lua文档知识点概览 #### 一、引言 Lua是一种轻量级、高效且可嵌入的脚本语言,广泛应用于...以上内容覆盖了Lua语言的基础概念、高级特性以及标准库的使用方法,对于学习和使用Lua都是非常宝贵的知识点。

    lua-5.3.4源码

    4. 元表与元方法:通过元表实现面向对象编程,元方法用于操作表的行为。 二、虚拟机与字节码 1. Lua虚拟机(VM):Lua的执行引擎,负责解释执行字节码。在5.3.4版本中,VM进一步优化,提升了执行效率。 2. 字节码:...

    LUA程序设计参考文档

    元表(metatable)是LUA的另一个特色,它可以为表提供元方法(如__add、__mul等),实现自定义操作符。 三、函数与模块 在LUA中,函数是一等公民,可以作为参数传递,也可以作为返回值。LUA的模块系统允许将代码...

    脚本语言lua学习和分析

    ### 脚本语言Lua学习和分析 #### 一、Lua简介与特点 Lua是一种轻量级、高效的脚本语言,被广泛应用于游戏开发、Web应用、自动化脚本等领域。Lua的设计初衷是易于嵌入其他应用程序中,为这些程序提供灵活的扩展能力...

    Beginning Lua Programming电子书

    ### 相关知识点 #### 一、Lua编程语言简介 - **定义与起源**:Lua是一种轻量级的脚本...通过本书的学习,不仅可以掌握Lua语言的基本用法,还能了解到如何利用Lua进行复杂项目的开发,为将来的职业发展打下坚实的基础。

    lua中文教程

    1. 元表:Lua允许为任何对象定义元表,元表中包含元方法,用于控制对象的行为。例如,`__add`元方法可以定义两个表相加的操作。 2. 元方法:通过`__index`元方法可以实现表的继承,`__call`元方法可以让表像函数...

    Lua5.0中文参考

    - **元表和元方法**:Lua通过元表(metatable)和元方法(metamethods)提供了强大的数据抽象能力,可以实现高级的面向对象编程功能。 #### 五、《Programming in Lua》书籍介绍 - **作者**:Roberto Ierusalimschy...

    lua5.3中文手册

    - **元表及元方法**:元表是Lua的一个高级特性,可以用来定制表的行为,例如定义特殊的方法来改变表的索引方式、加法操作等。 - **垃圾收集**: - **垃圾收集的元方法**:介绍如何通过设置特定的元方法来控制垃圾...

    LUA 编程指南中文版

    - **面向对象编程**:Lua虽然不是面向对象语言,但可以通过表和元方法实现面向对象编程风格。 #### 六、高级话题 - **C与Lua的交互**:深入了解如何使用C语言编写Lua模块,以及如何从Lua脚本中调用C函数。 - **错误...

    Lua 编程指南

    2. 元表:元表是Lua中的一种高级特性,允许我们为表定义元方法,即通过特定键(如`__add`)调用的特殊操作。元表是通过`setmetatable`函数设置的。 ### 三、函数 1. 函数定义:Lua中的函数是一等公民,可以作为...

    lua学习资料

    - **Metatables and Metamethods**:深入探讨元表和元方法的使用,包括算术运算、关系运算以及库定义的元方法等。 通过以上内容的学习,读者可以全面了解Lua语言的基础知识及其在实际开发中的应用。无论是初学者...

    关于LUA的学习资料

    #### 六、学习LUA的方法 1. **阅读官方文档**:官方文档是最权威的学习资源,它覆盖了LUA的所有基础知识和技术细节。 2. **实践编程**:通过实际编写代码来加深理解是非常有效的学习方法。可以从简单的练习项目开始...

    Lua Programming

    Lua语言简洁高效,易于学习和使用。 #### 二、入门篇 ##### 2.1 Hello, World! 在Lua中编写一个简单的“Hello, World!”程序是非常直观的: ```lua print("Hello, World!") ``` 这段代码通过`print`函数输出字符串...

    使用_cocos2d-x_和_Lua_快速开发游戏.pdf

    ### 使用_cocos2d-x_和_Lua_快速开发游戏 #### 一、概述 《使用_cocos2d-x_和_Lua_快速开发游戏》是一篇深入介绍如何结合cocos2d-x与Lua进行高效游戏开发的文章。该文不仅阐述了cocos2d-x与Lua的优势,还提供了一...

Global site tag (gtag.js) - Google Analytics