可以通过一个元表修改一个值的行为,使其在面对一个非预定义操作时执行一个指定操作
元表: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中的表与面向对象编程 在Lua中,table是所有数据结构的基础,它既可以用作数组,也可以用作哈希...
当通过键访问表时,如果没有找到对应的值,Lua会根据元表中的 `__index` 键来进行进一步的操作: - 如果 `__index` 是一个表,Lua将在该表中查找相应的键。 - 如果 `__index` 是一个函数,Lua将调用该函数,并将原表...
Lua是一种动态类型语言,其值可以是六种基本类型之一:nil、boolean、number、string、userdata和function,以及两种复合类型:table和thread(协程)。不同类型的值在Lua中有不同的表示方式和行为。 2. 环境和全局...
在Android开发中,有时我们需要使用脚本语言来增强应用的灵活性和可扩展性,而Lua就是这样一种轻量级、高效且易于学习的脚本语言。本文将深入探讨如何在Android应用中集成Lua,并实现Android与Lua之间的交互。 一、...
### Lua API及Lua文档知识点概览 #### 一、引言 Lua是一种轻量级、高效且可嵌入的脚本语言,广泛应用于...以上内容覆盖了Lua语言的基础概念、高级特性以及标准库的使用方法,对于学习和使用Lua都是非常宝贵的知识点。
4. 元表与元方法:通过元表实现面向对象编程,元方法用于操作表的行为。 二、虚拟机与字节码 1. Lua虚拟机(VM):Lua的执行引擎,负责解释执行字节码。在5.3.4版本中,VM进一步优化,提升了执行效率。 2. 字节码:...
元表(metatable)是LUA的另一个特色,它可以为表提供元方法(如__add、__mul等),实现自定义操作符。 三、函数与模块 在LUA中,函数是一等公民,可以作为参数传递,也可以作为返回值。LUA的模块系统允许将代码...
### 脚本语言Lua学习和分析 #### 一、Lua简介与特点 Lua是一种轻量级、高效的脚本语言,被广泛应用于游戏开发、Web应用、自动化脚本等领域。Lua的设计初衷是易于嵌入其他应用程序中,为这些程序提供灵活的扩展能力...
### 相关知识点 #### 一、Lua编程语言简介 - **定义与起源**:Lua是一种轻量级的脚本...通过本书的学习,不仅可以掌握Lua语言的基本用法,还能了解到如何利用Lua进行复杂项目的开发,为将来的职业发展打下坚实的基础。
1. 元表:Lua允许为任何对象定义元表,元表中包含元方法,用于控制对象的行为。例如,`__add`元方法可以定义两个表相加的操作。 2. 元方法:通过`__index`元方法可以实现表的继承,`__call`元方法可以让表像函数...
- **面向对象编程**:Lua虽然不是面向对象语言,但可以通过表和元方法实现面向对象编程风格。 #### 六、高级话题 - **C与Lua的交互**:深入了解如何使用C语言编写Lua模块,以及如何从Lua脚本中调用C函数。 - **错误...
- **元表和元方法**:Lua通过元表(metatable)和元方法(metamethods)提供了强大的数据抽象能力,可以实现高级的面向对象编程功能。 #### 五、《Programming in Lua》书籍介绍 - **作者**:Roberto Ierusalimschy...
- **元表及元方法**:元表是Lua的一个高级特性,可以用来定制表的行为,例如定义特殊的方法来改变表的索引方式、加法操作等。 - **垃圾收集**: - **垃圾收集的元方法**:介绍如何通过设置特定的元方法来控制垃圾...
2. 元表:元表是Lua中的一种高级特性,允许我们为表定义元方法,即通过特定键(如`__add`)调用的特殊操作。元表是通过`setmetatable`函数设置的。 ### 三、函数 1. 函数定义:Lua中的函数是一等公民,可以作为...
- **Metatables and Metamethods**:深入探讨元表和元方法的使用,包括算术运算、关系运算以及库定义的元方法等。 通过以上内容的学习,读者可以全面了解Lua语言的基础知识及其在实际开发中的应用。无论是初学者...
#### 六、学习LUA的方法 1. **阅读官方文档**:官方文档是最权威的学习资源,它覆盖了LUA的所有基础知识和技术细节。 2. **实践编程**:通过实际编写代码来加深理解是非常有效的学习方法。可以从简单的练习项目开始...
Lua语言简洁高效,易于学习和使用。 #### 二、入门篇 ##### 2.1 Hello, World! 在Lua中编写一个简单的“Hello, World!”程序是非常直观的: ```lua print("Hello, World!") ``` 这段代码通过`print`函数输出字符串...