解析LUA中關于Package定義學習筆記
LUA中關于Package定義學習筆記是本文要介紹的內容,主要是來學習lua中對Package,具體內容倆看本文詳解。Package是個很邏輯的概念。也就是說很可能不是語言直接提供的設施。cpp里的namespace可以用來實現package,在LUA中則是依靠table機制來實現。實現的方式大同小異,本文總結了在《lua中文手冊》中出現的3種方式。
方式一: 直接將所有組成包的數據和方法定義在包中,代碼看起來像是這樣:
- vector3d = {} -- 包名
- function vector3d.function1()
- ......
- end
- function vector3d.function2()
- ......
- if (vector3d.function1()) then
- ......
- end
- end
- return vector3d
這樣定義的就是一個vector3d包,使用require語言打開這個包后,就可以使用 vector3d.function1和vector3d.function2這兩個函數了。
這是最直接***理解的一種Package定義方式,但是有一定的弊端。這個弊端主要體現在Package的實現過程中。可以看到,即使在
vector3d.function2()中使用function1()函數,也必須完整的加上vector3d包名,否則無法進行函數調用。Package的作者要稍微累一點,不過使用者倒是還好。特別的注意***的 return vector3d 語句,有了這句后調用者可以按照如下方式重命名包:
- MyPackage = require "vector3d"
- MyPackage.function2()
方式二: 使用局部函數定義所有的Package內函數,然后在Package的結尾處將需要公開的函數直接放入Package中。代碼看起來像這樣:
- vector3d = {} -- 包名
- local function function1()
- ......
- end
- local function function2()
- ......
- if (function1()) then
- ......
- end
- end
- vector3d = {function1 = functoin1,
- function2function2 = function2
- }
- return vector3d
***給包中賦值的部分就是將需要的接口公開的部分。這樣做的好處:不需要公開的函數可以完全隱藏起來(都是local函數);Package內部的各個函數相互之間調用的時候不再需要加Package名稱進行區分; 可以按照需要隨意的重命名Package公開的接口名稱。這種方式的弊端在于定義的時候需要寫上local,這算不算弊端就看你了 - -。 就我個人而言,我還是比較喜歡這個定義方式。能明確的區分出接口和私有的定義,公開接口的名稱還可以隨意改變,這就意味著可以隨意替換內部實現而不需要影響外部調用者。
無論用什么方法去定義Package,都是為了在邏輯上更好的規劃代碼層次。LUA中的table機制的確是一個活力無限的機制啊。Package依靠這個實現,LUA本身自己有些機制也依賴于Table(比如全局變量就放在_G表中)
手冊里還有個如何"拆開"Package的代碼段,很好的展現了table的強大之處(Package也是在table上構筑的邏輯產物)。將Package拆開的意思,就是將所有 Package中公開的名字放入_G表中。也就是讓 Package.A() 變成_G.A (_G在一般情況下不需要寫,默認引用了)
- function openpackage (ns)
- for n,v in pairs(ns)
- do
- _G[n] = v
- end
- end
小結:解析LUA中關于Package定義學習筆記的內容介紹完了,希望通過本文的學習能對你有所幫助!