Lua 元表

6人阅读 评论(0) 收藏 举报
分类:
例程
a = {1, 2, 3}
b = {2, 3, 4}

mt = {}
mt.__add = function(a,b)
	local len = table.getn(a);
	local res = {}
	for i = 1, len do
		res[i] = a[i] + b[i]
	end

	return res
end
setmetatable(a, mt)
setmetatable(b, mt)
c = a + b
for k, v in ipairs(c) do
	print(k, v)
end
运行结果
1 3
2 5
3 7


__add (+)
__sub (-)
__mul (*)
__div (/)
__mod (%)
__pow (^)
__unm 
__concat (..)
__len (#)
__eq (==)
__lt (<)
__le (<=)
__index  (table[key])
__newindex (table[key] = value)
__call 
__tostring (打印表中元素)

例程: __index

tab = {a = 5, b = 7}
tab.__index = function(t, key)
	return tab[key]
end

tab.__newindex = function(t, key, val)
	tab[key] = val
end

mytab = {}
setmetatable(mytab, tab)
print(mytab.a)	-- 元素不存在时,将访问元表
print(rawget(mytab, a))	-- 判断表 mytab 中是否存在 a

mytab.test = 9	-- 这个值被存入元表,调用了 __newindex
print(mytab.test)
print(rawget(mytab, test))
运行结果
5
nil
9

nil

例程

tab = {a = 5, b = 7}
tab.__index = function(t, key)
	return tab[key]
end

tab.__newindex = function(t, key, val)
	tab[key] = val
end

tab.__tostring = function(t)	-- 打印表 mytab 中的元素
	local l = table.getn(t)
	local s = ""
	for i = 1, l do
		s = s .. t[i] .. ","
	end

	return s
end

mytab = {2,3,4}
setmetatable(mytab, tab)
print(mytab.a)	-- 元素不存在时,将访问元表
print(rawget(mytab, a))	-- 判断表 mytab 中是否存在 a

mytab.test = 9	-- 这个值被存入元表,调用了 __newindex
print(mytab.test)
print(rawget(mytab, test))

print(mytab)
运行结果
5
nil
9
nil
2,3,4,

查看评论

深入浅出Lua编程实战视频课程:(3)lua编译器源代码赏析

-
  • 1970年01月01日 08:00

lua学习笔记16:table元表详解

一 table本质 Lua中table本质实际上是个类似HashMap东西。 其元素是很多的Key-Value对,类似iOS中的字典NSDictionary。 如果尝试访问了一个表中并不存在的元...
  • xufeng0991
  • xufeng0991
  • 2015-02-07 20:17:43
  • 2552

lua元表理解

在lua中任何变量都有一个元表(我相信每个字符串元表都是string相关,所以可以使用string:length()),元表中特殊的值有特殊的含义,比如__index,__call,__add等等。 ...
  • zbffff
  • zbffff
  • 2015-08-23 22:13:22
  • 6337

lua 的元表和元表的__index字段

众所周知,lua的继承是通过元表的__index字段来实现的,比如child类要继承自parent类,就需要把child的元表设为parent,并且要把child的元表(此时是parent)的__in...
  • sibaison
  • sibaison
  • 2017-02-26 14:59:03
  • 585

lua 元表 __index 继承的实现

Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Value对,如果尝试访问了一个表中并不存在的元素时,就会触发Lua的一套查找机制,也是凭借这个机制,才能够实现“面向对象”的。 ...
  • xiaogou56a
  • xiaogou56a
  • 2015-02-27 15:37:30
  • 768

详解Lua中的元表概念

Lua中的元表概念 点击打开链接
  • u010616114
  • u010616114
  • 2016-07-15 14:42:32
  • 1010

Lua元表与元方法详解(转)

Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加。假设a和b都是table,通过元表可以定义如何计算表达式a+b。当Lua试图将两个table相加时,...
  • treasure3334
  • treasure3334
  • 2015-05-24 15:18:25
  • 3244

lua——元表、元方法、继承

【元表】 元表中的键为事件(event),称值为元方法(metamethod)。 通过函数getmetatable查询任何值的元表,通过函数setmetatable替换表的元表。 set...
  • adfansong
  • adfansong
  • 2015-08-17 20:39:48
  • 1860

LUA元表和类的简单例子

学习lua有一段时间了,今天终于学会了怎么使用元表,还有用lua表模拟类,综合实例讲解,用lua元表模拟C++模板和类...
  • zhouxicai
  • zhouxicai
  • 2013-11-25 17:16:07
  • 2189

Lua下通过元表模拟OOP编程,继承多态

Lua本身是没有以明确的定义来支持OOP编程的,但是我们却可以通过Lua本身提供的一些特性来间接实现简单的面向对象的编程。...
  • yue7603835
  • yue7603835
  • 2014-12-09 10:16:01
  • 3760
    个人资料
    持之以恒
    等级:
    访问量: 949
    积分: 719
    排名: 7万+
    文章存档
    最新评论