[分享] Lua Metatables 概念

看板Programming作者 (bmzz)時間14年前 (2011/05/17 11:31), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/1
以下內容源自小弟的部落格,取出一些重點轉貼自 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
文章代碼(AID): #1DqUmjNN (Programming)
文章代碼(AID): #1DqUmjNN (Programming)