[分享] Lua Metatables 概念
以下內容源自小弟的部落格,取出一些重點轉貼自 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
推
05/17 19:09, , 1F
05/17 19:09, 1F
Programming 近期熱門文章
PTT數位生活區 即時熱門文章
7
20