作者bmzz (bmzz)
站内Programming
标题[分享] Lua Metatables 概念
时间Tue May 17 11:31:55 2011
以下内容源自小弟的部落格,取出一些重点转贴自 bbs
http://justbm.blogspot.com/2011/05/lua-metatables.html
如有错误烦请指教,谢谢。
====
在 Lua 里,metatables 的存在是非常重要的,它提供了高度灵活性
供程式设计师实现较良好的程式架构来进行後续的开发,例如:OO 就
是由 metatables 里面的 __index 来实现。
但对我来说,这概念不是很好懂,而且应用上有点 magic。
在讲 metatables 之前,还是要先聊聊 Lua 里面的 table。table 可
以存放各种资料型态(除了 nil),因此一份 table 里面有五花八门的
资料是可能的。但不管是什麽资料,都一定会有一个 key 来做对应,
例如:
== code start ==
t = {name = 'goodman', age = 29, 123, 456, 789}
for key, value in pairs(t) do
print(key, value)
end
-- output is :
-- 1 123
-- 2 456
-- 3 789
-- name goodman
-- age 29
== code end ==
了解 table 里面的 key 是什麽之後,再来聊聊 metatables。
每一个 table 都可以当成别人的 metatable,因此 metatable 也只
是一个普通的 table 而已。在每一个 table 里,都有一些特殊的 key
,不过平时将这些 key 赋值也是没有任何特殊意义的。但当 table
本身成为别人的 metatable 时,这些特殊的 key 开始影响另一个 table
,举例来说:table A 为 table B 的 metatable,则 table A 里面
的特殊 key 影响到的是 table B 的行为。
每一个特殊 key 对应到某种操作或行为,在 Lua 5.0 Reference Manual
里称做 event (其实非常贴切),在这边拿最常见的 __index 作为例子。
__index 会影响到的行为是:从 table 中取值的动作。(严格说起来,应
该是取「不存在的值」的动作)
而 metatable 中的 __index 的内容,又会因为型态的不同,而有两种不
同的处理。
欲看所有 key 的细节,请参考Lua 5.0 Reference Manual # 2.8
重点整理
1. metatable 也是个普通的 table
2. 每个 table 内都有一些特殊的 key (如 __index, __add…etc)
3. 这些特殊 key 不影响 table 本身,而是影响将其当为 metatable
的 table
4. __index 会影响到的行为是:从 table 中取值的动作。(严格说起
来,应该是取「不存在的值」的动作)
5. __index 会依照内容的型态,对取值的动作有不同的处理
参考连结
http://www.lua.org/manual/5.0/manual.html
http://phrogz.net/lua/LearningLua_MetatableEvents.html
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.128.103.223
1F:推 linjack:赞赞,推一下 :) 203.72.57.78 05/17 19:09