lua--從小白開始(3)

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   使用   ar   strong   檔案   

這篇為學習lua雜記。

一、關於lua源碼的一些檔案:

1.lua.c ——  lua解譯器程式源碼。

2.lua.h —— 該標頭檔定義了Lua提供的基礎函數,包括建立Lua環境,調用Lua函數(如 lua_pcall)、讀寫Lua環境中全域變數,

      以及註冊供Lua調用的新函數等。該標頭檔定義所有內容都有一個“lua_”首碼。

3.luaxlib.h —— 該標頭檔定義了Lua輔助庫提供的函數。他的所有定義都以“luaL_”為首碼(如 luaL_loadbuffer)。輔助庫是一個

    使用lua.h中的API編寫出來的一個較高的抽象層。註:輔助庫沒有直接存取Lua內部,它都是官方的基礎API來完成

    所有工作的。

二、關於lua的一些函數:

1.luaL_newstate() —— 建立一個新的Lua環境(或狀態)。當建立一個新的環境時,該環境為空白,新環境中沒有包含預定義的函數。

為了使Lua保持小巧,所有標準庫都被組織到了不同的包中。在lualib.h中定義了開啟這些庫的函數。

2.luaL_openlibs (lua_State *L) —— 該函數可以開啟所有的標準庫。

3.luaL_loadbuffer(L,s,sz,n) —— 編譯載入到Lua環境中的命令。如果沒有錯誤,此函數返回0,並想棧中壓入編譯後的程式塊。   

4.lua_pcall(L,n,r,f)  —— 通過調用此函數,將luaL_loadbuffer()壓入棧中的程式塊彈出,並在保護模式中運行它。與luaL_loadbuffer

   一樣,該函數返回0表示沒有錯誤。如果發生錯誤,那麼這些函數就會向棧中壓入一條錯誤訊息。

5.lua_tostring(L,i) —— 用該函數可以擷取lua_pcall調用的函數錯誤時向棧中壓入的一條錯誤資訊。列印後,

  可以用lua_pop()把它從棧中刪除。

三、關於棧的一些基礎理解:

一、關於對棧操作的一些函數:

①.壓棧操作函數

1.void lua_pushnil (lua_State *L) —— 向棧中壓入常量nil值。

2.lua_pushnumber(lua_State *L)  ——向棧中壓入雙精確度浮點數。

3.lua_pushinteger(lua_State *L)  —— 向棧中壓入整型數。

4.lua_pushboolean(lua_State *L)  —— 向棧中壓入bool變數(C語言中用整數)。

5.lua_pushlstring(lua_State *L)  —— 向棧中壓入字串(char * 及長度)。

6.lua_pushstring(lua_State *L)  —— 向棧中壓入以字元零結尾的字串。


7.int lua_checkstack(lua_State *L, int sz) —— 檢查棧是否夠用。


③.查詢棧中元素

在Lua通訊中,向棧查詢元素是通過索引(index),正索引是從第一個壓入參數開始,負索引是從最後一個

壓入參數開始。

1. int lua_is*(lua_State *L, int index) —— 此類函數是查詢棧中元素是否是查詢的類型。

需要注意的是:lua_isnumber不會檢查值是否是數字類型,而是檢查值是否能轉換為數字類型,lua_isstring也具有

同樣的行為。因此,對於任何數字,lua_isstring都返回真。

2.int lua_type (lua_State *L, int idx) —— 該函數返回戰洪元素的類型。每種類型都對應一個常量,這些常量定義在標頭檔lua.h中。

注意:

該函數一般可用在一個switch語句中。另外,若要檢查一個元素是否為真正的字串或數字(無需轉換的),也可以使用換個函數。

lua_type 傳回型別常量定義


3.lua_to*系類函數用於從棧中擷取一個值,函數原型



註:當Lua調用一個C函數返回時,Lua就會清空它的棧。所以,不要在C函數之外使用在C函數內獲得的指向Lua字串的指標。

④.其他對棧操作的函數:

1.int lua_gettop (lua_State *L) —— 該函數返回棧中元素的個數,也可以說是棧頂的索引。

2.void lua_settop (lua_State *L, int idx) —— 將棧頂設定為一個指定的位置,如果之前的棧頂比新設定的更高,那麼搞出來的就被丟棄;

反之,會向棧中壓入nil來不足大小。即修改棧中元素的數量。有一個特殊的調用, lua_settop (L, 0)能清空棧。在Lua中還定義了一個

特殊的宏:#define lua_pop(L,n) lua_settop(L, -(n)-1) 

3.void lua_pushvalue (lua_State *L, int idx) —— 該函數會將指定索引上的值的副本壓入棧。即,把堆棧上給定有效處索引處的元素作一

個拷貝壓棧。

4.void lua_remove (lua_State *L, int idx)  —— 該函數刪除索引上的元素,並將該索引以上的元素下移以填補空缺。

5.void lua_insert (lua_State *L, int idx) —— 該函數會上移指定位置上的所有元素以開闢一個槽的空間,然後將棧頂元素移到該位置。

6.void lua_replace (lua_State *L, int idx) —— 函數會把棧頂元素移動到給定位置(並且把這個棧頂元素彈出), 不移動任何元素(因

此在那個位置處的值被覆蓋掉)。

註:

lua_settop(L,-1) 和lua_insert (L,-1)不會對棧產生影響。

lua_settop(L,-1) 為將棧頂元素設定為它當前值。

lua_insert (L,-1)為將棧頂元素移動到棧頂





希望大家多多指正,共同進步。

                            每天進步一點點。。。


















lua--從小白開始(3)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.