一個(gè)關(guān)于Lua腳本管理器詳解
Lua腳本管理器詳解是本文要介紹的內(nèi)容,這不是一個(gè)文本編輯器或者ide之類的東東,實(shí)際上它只是一個(gè)dll,lua是膠水語(yǔ)言,這個(gè)管理器的目的是為了讓C/C++更好的支持lua。
通常項(xiàng)目里管理腳本的方法都是分開(kāi)文件存放,lua里沒(méi)有工程的概念,所以文件是最小單位,這樣一來(lái)腳本文件數(shù)量的增長(zhǎng)會(huì)帶來(lái)一個(gè)問(wèn)題,名字污染。lua里定義的變量默認(rèn)是全局的,只有使用了local定義的才是本地的,這樣一來(lái)你在腳本a里定義的函數(shù)可能和在腳本b里定義的函數(shù)同名,而這完全不會(huì)帶來(lái)任何錯(cuò)誤或警告,因?yàn)樵趌ua里函數(shù)就是一個(gè)值,你可以隨時(shí)修改。
導(dǎo)出一個(gè)全局函數(shù)Include,它能把其它腳本包含進(jìn)來(lái),就像C里的#include一樣,實(shí)際上它沒(méi)有包含任何內(nèi)容進(jìn)來(lái),只是建立了一個(gè)腳本間的關(guān)系網(wǎng),每一個(gè)腳本是一個(gè)頂點(diǎn),Include建立到達(dá)關(guān)系。每個(gè)腳本是隔離開(kāi)的,即不同的腳本中的變量是可以同名的,但是是不同的變量,這個(gè)通過(guò)函數(shù)環(huán)境實(shí)現(xiàn)。
關(guān)鍵的東西是,優(yōu)先關(guān)系,lua里雖然沒(méi)有定義變量的語(yǔ)句,但是卻有index和newindex事件,對(duì)一組值 取值的時(shí)候 t[k] 就觸發(fā)index事件,對(duì)一組值 設(shè)定值的時(shí)候 t[k] = v 就觸發(fā)newindex事件。后者就相當(dāng)于是定義變量啦,即第一次使用。
index優(yōu)先關(guān)系是:local > script > register-table > global,register-table是從C里導(dǎo)出的一些東西的總和,總的原則是越具體的東西越先考慮。首先是找local變量,找不到 就找本環(huán)境中的變量,找不到 就找Include關(guān)系能到達(dá)的其它腳本中的變量,找不到 就找register-table中的變量,找不到 就找全局變量。
newindex優(yōu)先關(guān)系是:local > script(no include) > global,k是local就設(shè)置k = v,否則 如果t是table 先rawget(t, k) 找到了就設(shè)置值,否則 找global,global中有值就是global 否則就設(shè)置script。這里有些混亂,換言之,就是script中和global中不會(huì)同時(shí)有某個(gè)值,global中的值還是會(huì)影響到script中的值,也就是說(shuō)不要定義太多的global值,比如你在腳本中寫(xiě):
- function print()
- end
它會(huì)認(rèn)為是global的print,而把它重定義掉。
而實(shí)際上你在腳本里是無(wú)法定義新的global值的,你定義一個(gè)global中沒(méi)有的值,它會(huì)轉(zhuǎn)為script環(huán)境中的值。除了系統(tǒng)的一些函數(shù),連導(dǎo)出的函數(shù)都不是直接放在global中的,所以一般無(wú)法定義新的global值。
好了,給了你限制還要給你靈活性,global中有一個(gè)Global函數(shù),它能定義global值,接受1到2個(gè)參數(shù),第一個(gè)是名字,第二個(gè)是初值。你如果對(duì)已有g(shù)lobal值再調(diào)用它,會(huì)給一個(gè)錯(cuò)誤信息,說(shuō)你重定義了某個(gè)值。你可以在一個(gè)腳本中這樣寫(xiě):
- Global("Foo")
- function Foo()
- end
這樣這個(gè)Foo就不是在這個(gè)腳本中的函數(shù)了,在其它腳本中不用Include也能訪問(wèn)。
此外,還在增加其它功能,比如lua序列化,將來(lái)還會(huì)增加lua的userdata和lua調(diào)試等。寫(xiě)這個(gè)的過(guò)程還是學(xué)到了很多東西,發(fā)現(xiàn)學(xué)lua不用找任何資料,直接上官網(wǎng)查手冊(cè)就行了,手冊(cè)就只有一頁(yè),很方便。
小結(jié):解析一個(gè)關(guān)于Lua腳本管理器的內(nèi)容介紹完了,希望通過(guò)本文的學(xué)習(xí)能對(duì)你有所幫助!