lua指令碼管理器詳解是本文要介紹的內容,這不是乙個文字編輯器或者ide之類的東東,實際上它只是乙個dll,lua是膠水語言,這個管理器的目的是為了讓c/c++更好的支援lua。
通常專案裡管理指令碼的方法都是分開檔案存放,lua裡沒有工程的概念,所以檔案是最小單位,這樣一來指令碼檔案數量的增長會帶來乙個問題,名字汙染。lua裡定義的變數預設是全域性的,只有使用了local定義的才是本地的,這樣一來你在指令碼a裡定義的函式可能和在指令碼b裡定義的函式同名,而這完全不會帶來任何錯誤或警告,因為在lua裡函式就是乙個值,你可以隨時修改。
匯出乙個全域性函式include,它能把其它指令碼包含進來,就像c裡的#include一樣,實際上它沒有包含任何內容進來,只是建立了乙個指令碼間的關係網,每乙個指令碼是乙個頂點,include建立到達關係。每個指令碼是隔離開的,即不同的指令碼中的變數是可以同名的,但是是不同的變數,這個通過函式環境實現。
關鍵的東西是,優先關係,lua裡雖然沒有定義變數的語句,但是卻有index和newindex事件,對一組值 取值的時候 t[k] 就觸發index事件,對一組值 設定值的時候 t[k] = v 就觸發newindex事件。後者就相當於是定義變數啦,即第一次使用。
index優先關係是:local > script > register-table > global,register-table是從c裡匯出的一些東西的總和,總的原則是越具體的東西越先考慮。首先是找local變數,找不到 就找本環境中的變數,找不到 就找include關係能到達的其它指令碼中的變數,找不到 就找register-table中的變數,找不到 就找全域性變數。
newindex優先關係是: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()它會認為是global的print,而把它重定義掉。end
而實際上你在指令碼裡是無法定義新的global值的,你定義乙個global中沒有的值,它會轉為script環境中的值。除了系統的一些函式,連匯出的函式都不是直接放在global中的,所以一般無法定義新的global值。
好了,給了你限制還要給你靈活性,global中有乙個global函式,它能定義global值,接受1到2個引數,第乙個是名字,第二個是初值。你如果對已有global值再呼叫它,會給乙個錯誤資訊,說你重定義了某個值。你可以在乙個指令碼中這樣寫:
global("foo")這樣這個foo就不是在這個指令碼中的函式了,在其它指令碼中不用include也能訪問。function foo()
end
此外,還在增加其它功能,比如lua序列化,將來還會增加lua的userdata和lua除錯等。寫這個的過程還是學到了很多東西,發現學lua不用找任何資料,直接上官網查手冊就行了,手冊就只有一頁,很方便。
小結:解析乙個關於lua指令碼管理器的內容介紹完了,希望通過本文的學習能對你有所幫助!
python優先順序佇列 python 優先順序佇列
簡介 優先順序佇列是基於堆的,關於堆的時候可以參考文章堆,優先順序佇列就是入隊時,會分配乙個優先順序,之後出隊時,根據優先順序出列。如,入隊時 4,a 6,r 3 d 則出隊順序 6,r 4,a 3 d 優先順序佇列的python實現 class priorityqueue object def i...
lua算術表示式優先順序筆記
從低到高 and or not 右連線 最左推導的文法上的設計應該 高優先順序的表示式總是作為低優先順序表示式的最小不可分割因子 是 e eandandort eorandort andort andort andort logict andort logict andort logict ando...
Linux程序優先順序和調整優先順序
linux 是乙個多使用者 多工的作業系統,系統中通常執行著非常多的程序。但是 cpu 在乙個時鐘週期內只能運算一條指令 現在的 cpu 採用了多執行緒 多核心技術,所以在乙個時鐘週期內可以運算多條指令。但是同時運算的指令數也遠遠小於系統中的程序總數 那問題來了 誰應該先運算,誰應該後運算呢?這就需...