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