lua的元表
来源:互联网 发布:啄木鸟软件测试 编辑:程序博客网 时间:2024/04/30 00:52
概述
Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。
本质
元表本质为给table添加了一个键值对,键为__metatable
,值为一个表,当对原始表操作的时候,就会去这个表中找键值对,比如__index
,__call
等键,然后找到对应的值,值可以是一个值或方法,结构大致如下:
{ "name": "hewe", "age": 12, "__metatable":{ "__index": "23", "__call":function(){ }, ... }, ...}
定义
通过两个函数进行操作元表:
* setmetatable(table, metatable)
对指定table设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable会失败。
* getmetatable(table)
返回对象的元表(metatable)。
mytable = {} -- 普通表 mymetatable = {} -- 元表setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表 getmetatable(mytable) -- 这回返回mymetatable
metatable
常用键
__index
元方法
- 当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。
- 如果__index包含一个表格,Lua会在表格中查找相应的键。
- 如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。
$ luaLua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio> other = { foo = 3 } > t = setmetatable({}, { __index = other }) > t.foo3> t.barnil
__newindex
元方法
当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。
__call
元方法
__call
元方法在 Lua 调用一个值时调用。以下实例演示了计算表中元素的和:
mytable = setmetatable({10},{ __call = function(mytable,arg1,arg2,arg3) mytable.sum = mytable[1] + arg1 + arg2 + arg3 sum = mytable.sum return sum end})print(mytable(1,2,3))
call
方法的参数和返回值都可以自定义,只要在调用的时候mytable()
相应处理即可.
查找表元素规则
Lua查找一个表元素时的规则,其实就是如下3个步骤:
1. 在表中查找,如果找到,返回该元素,找不到则继续
2. 判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
3. 判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。
阅读全文
0 0
- lua的元表
- lua的元表
- lua的元表
- lua元表的理解
- Lua元表的使用
- LUA元表的正确理解
- lua 的元表和元表的__index字段
- LUA元表、元操作
- Lua 元表 元方法
- lua 元表 __index 继承的实现
- Lua 的元表怎么理解
- Lua元表的基础示例。
- Lua元表的定义和使用
- lua 元表
- lua元表学习
- lua元表
- lua元表
- lua元表
- Python中bytearray()函数的初识
- R显卡VR性能如何?AMD发布 VRMark Cyan Room 测试结果
- html/css
- lua语法糖
- WPF开发ArcGIS时候,Graphic模板中不能使用ViewBox控件的原因说明
- lua的元表
- java类加载
- 计算机网络读书笔记
- 最新Hive函数
- C语言-进程控制编程
- 致命错误: Call to undefined function ......ftp_connect()
- 感谢题主给我一个反思失败的机会。
- python基础-hashlib、logging、configparse
- Jersey