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