您好,登錄后才能下訂單哦!
本篇內容主要講解“Lua中有哪些常用函數”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Lua中有哪些常用函數”吧!
lua_Alloc lua_getallocf (lua_State *L, void **ud);
返回給定狀態機的內存分配器函數。如果 ud
不是 NULL
,Lua 把調用lua_newstate
時傳入的那個指針放入*ud
。
void lua_getfenv (lua_State *L, int index);
把索引處值的環境表壓入堆棧。
void lua_getfield (lua_State *L, int index, const char *k);
把 t[k]
值壓入堆棧,這里的 t
是指有效索引 index
指向的值。在 Lua 中,這個函數可能觸發對應 “index” 事件的元方法(參見 §2.8)。
void lua_getglobal (lua_State *L, const char *name);
把全局變量 name
里的值壓入堆棧。這個是用一個宏定義出來的:
#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, s)
int lua_getmetatable (lua_State *L, int index);
把給定索引指向的值的元表壓入堆棧。如果索引無效,或是這個值沒有元表,函數將返回 0 并且不會向棧上壓任何東西。
void lua_gettable (lua_State *L, int index);
把 t[k]
值壓入堆棧,這里的 t
是指有效索引 index
指向的值,而 k
則是棧頂放的值。
這個函數會彈出堆棧上的 key (把結果放在棧上相同位置)。在 Lua 中,這個函數可能觸發對應 “index” 事件的元方法(參見§2.8)。
int lua_gettop (lua_State *L);
返回棧頂元素的索引。因為索引是從 1 開始編號的,所以這個結果等于堆棧上的元素個數(因此返回 0 表示堆棧為空)。
void lua_insert (lua_State *L, int index);
把棧頂元素插入指定的有效索引處,并依次移動這個索引之上的元素。不要用偽索引來調用這個函數,因為偽索引不是真正指向堆棧上的位置。
typedef ptrdiff_t lua_Integer;
這個類型被用于 Lua API 接收整數值。
缺省時這個被定義為 ptrdiff_t
,這個東西通常是機器能處理的最大整數類型。
int lua_isboolean (lua_State *L, int index);
當給定索引的值類型為 boolean 時,返回 1 ,否則返回 0 。
int lua_iscfunction (lua_State *L, int index);
當給定索引的值是一個 C 函數時,返回 1 ,否則返回 0 。
int lua_isfunction (lua_State *L, int index);
當給定索引的值是一個函數( C 或 Lua 函數均可)時,返回 1 ,否則返回 0 。
int lua_islightuserdata (lua_State *L, int index);
當給定索引的值是一個 light userdata 時,返回 1 ,否則返回 0 。
int lua_isnil (lua_State *L, int index);
當給定索引的值是 nil 時,返回 1 ,否則返回 0 。
int lua_isnumber (lua_State *L, int index);
當給定索引的值是一個數字,或是一個可轉換為數字的字符串時,返回 1 ,否則返回 0 。
int lua_isstring (lua_State *L, int index);
當給定索引的值是一個字符串或是一個數字(數字總能轉換成字符串)時,返回 1 ,否則返回 0 。
int lua_istable (lua_State *L, int index);
當給定索引的值是一個 table 時,返回 1 ,否則返回 0 。
int lua_isthread (lua_State *L, int index);
當給定索引的值是一個 thread 時,返回 1 ,否則返回 0 。
int lua_isuserdata (lua_State *L, int index);
當給定索引的值是一個 userdata (無論是完整的 userdata 還是 light userdata )時,返回 1 ,否則返回 0 。
int lua_lessthan (lua_State *L, int index1, int index2);
如果索引 index1
處的值小于索引 index2
處的值時,返回 1 ;否則返回 0 。其語義遵循 Lua 中的 操作符(就是說,有可能調用元方法)。如果任何一個索引無效,也會返回 0 。
int lua_load (lua_State *L, lua_Reader reader, void *data, const char *chunkname);
加載一個 Lua chunk 。如果沒有錯誤, lua_load
把一個編譯好的 chunk 作為一個 Lua 函數壓入堆棧。否則,壓入出錯信息。 lua_load
的返回值可以是:
LUA_ERRSYNTAX
: 在預編譯時碰到語法錯誤;LUA_ERRMEM
: 內存分配錯誤。這個函數僅僅加栽 chunk ;而不會去運行它。
lua_load
會自動檢測 chunk 是文本的還是二進制的,然后做對應的加載操作(參見程序luac
)。
lua_load
函數使用一個用戶提供的reader
函數來讀取 chunk (參見lua_Reader
)。data
參數會被傳入讀取器函數。
chunkname
這個參數可以賦予 chunk 一個名字,這個名字被用于出錯信息和調試信息(參見§3.8)。
lua_State *lua_newstate (lua_Alloc f, void *ud);
創建的一個新的獨立的狀態機。如果創建不了(因為內存問題)返回 NULL
。參數 f
是一個分配器函數; Lua 將通過這個函數做狀態機內所有的內存分配操作。第二個參數 ud
,這個指針將在每次調用分配器時被直接傳入。
void lua_newtable (lua_State *L);
創建一個空 table ,并將之壓入堆棧。它等價于 lua_createtable(L, 0, 0)
。
lua_State *lua_newthread (lua_State *L);
創建一個新線程,并將其壓入堆棧,并返回維護這個線程的 lua_State
指針。這個函數返回的新狀態機共享原有狀態機中的所有對象(比如一些 table),但是它有獨立的執行堆棧。
沒有顯式的函數可以用來關閉或銷毀掉一個線程。線程跟其它 Lua 對象一樣是垃圾收集的條目之一。
void *lua_newuserdata (lua_State *L, size_t size);
這個函數分配分配一塊指定大小的內存塊,把內存塊地址作為一個完整的 userdata 壓入堆棧,并返回這個地址。
userdata 代表 Lua 中的 C 值。完整的 userdata 代表一塊內存。它是一個對象(就像 table 那樣的對象):你必須創建它,它有著自己的元表,而且它在被回收時,可以被監測到。一個完整的 userdata 只和它自己相等(在等于的原生作用下)。
當 Lua 通過 gc
元方法回收一個完整的 userdata 時, Lua 調用這個元方法并把 userdata 標記為已終止。等到這個 userdata 再次被收集的時候,Lua 會釋放掉相關的內存。
int lua_next (lua_State *L, int index);
從棧上彈出一個 key(鍵),然后把索引指定的表中 key-value(健值)對壓入堆棧(指定 key 后面的下一 (next) 對)。如果表中以無更多元素,那么lua_next
將返回 0 (什么也不壓入堆棧)。
典型的遍歷方法是這樣的:
/* table 放在索引 ‘t’ 處 / lua_pushnil(L); / 第一個 key / while (lua_next(L, t) != 0) { / 用一下 ‘key’ (在索引 -2 處) 和 ‘value’ (在索引 -1 處) / printf(“%s – %s\n”, lua_typename(L, lua_type(L, -2)), lua_typename(L, lua_type(L, -1))); / 移除 ‘value’ ;保留 ‘key’ 做下一次迭代 */ lua_pop(L, 1); }
在遍歷一張表的時候,不要直接對 key 調用 lua_tolstring
,除非你知道這個 key 一定是一個字符串。調用 lua_tolstring
有可能改變給定索引位置的值;這會對下一次調用 lua_next
造成影響。
typedef double lua_Number;
Lua 中數字的類型。確省是 double ,但是你可以在 luaconf.h
中修改它。
通過修改配置文件你可以改變 Lua 讓它操作其它數字類型(例如:float 或是 long )。
size_t lua_objlen (lua_State *L, int index);
返回指定的索引處的值的長度。對于 string ,那就是字符串的長度;對于 table ,是取長度操作符 (‘#
‘) 的結果;對于 userdata ,就是為其分配的內存塊的尺寸;對于其它值,為 0 。
lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
以保護模式調用一個函數。
nargs
和 nresults
的含義與 lua_call
中的相同。如果在調用過程中沒有發生錯誤, lua_pcall
的行為和 lua_call
完全一致。但是,如果有錯誤發生的話, lua_pcall
會捕獲它,然后把單一的值(錯誤信息)壓入堆棧,然后返回錯誤碼。同 lua_call
一樣, lua_pcall
總是把函數本身和它的參數從棧上移除。
如果 errfunc
是 0 ,返回在棧頂的錯誤信息就和原始錯誤信息完全一致。否則,errfunc
就被當成是錯誤處理函數在棧上的索引。(在當前的實現里,這個索引不能是偽索引。)在發生運行時錯誤時,這個函數會被調用而參數就是錯誤信息。錯誤處理函數的返回值將被lua_pcall
作為出錯信息返回在堆棧上。
典型的用法中,錯誤處理函數被用來在出錯信息上加上更多的調試信息,比如棧跟蹤信息 (stack traceback) 。這些信息在lua_pcall
返回后,因為棧已經展開 (unwound) ,所以收集不到了。
lua_pcall
函數在調用成功時返回 0 ,否則返回以下(定義在lua.h
中的)錯誤代碼中的一個:
LUA_ERRRUN
: 運行時錯誤。LUA_ERRMEM
: 內存分配錯誤。 對于這種錯,Lua 調用不了錯誤處理函數。LUA_ERRERR
: 在運行錯誤處理函數時發生的錯誤。void lua_pop (lua_State *L, int n);
從堆棧中彈出 n
個元素。
void lua_pushboolean (lua_State *L, int b);
把 b
作為一個 boolean 值壓入堆棧。
void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
把一個新的 C closure 壓入堆棧。
當創建了一個 C 函數后,你可以給它關聯一些值,這樣就是在創建一個 C closure (參見 §3.4);接下來無論函數何時被調用,這些值都可以被這個函數訪問到。為了將一些值關聯到一個 C 函數上,首先這些值需要先被壓入堆棧(如果有多個值,第一個先壓)。接下來調用lua_pushcclosure
來創建出 closure 并把這個 C 函數壓到堆棧上。參數n
告之函數有多少個值需要關聯到函數上。lua_pushcclosure
也會把這些值從棧上彈出。
void lua_pushcfunction (lua_State *L, lua_CFunction f);
將一個 C 函數壓入堆棧。這個函數接收一個 C 函數指針,并將一個類型為 function
的 Lua 值壓入堆棧。當這個棧頂的值被調用時,將觸發對應的 C 函數。
注冊到 Lua 中的任何函數都必須遵循正確的協議來接收參數和返回值(參見 lua_CFunction
)。
lua_pushcfunction
是作為一個宏定義出現的:
#define lua_pushcfunction(L,f) lua_pushcclosure(L,f,0)
const char *lua_pushfstring (lua_State *L, const char *fmt, …);
把一個格式化過的字符串壓入堆棧,然后返回這個字符串的指針。它和 C 函數 sprintf
比較像,不過有一些重要的區別:
%%
‘ (插入一個 ‘%
‘), ‘%s
‘ (插入一個帶零終止符的字符串,沒有長度限制), ‘%f
‘ (插入一個lua_Number
), ‘%p
‘ (插入一個指針或是一個十六進制數), ‘%d
‘ (插入一個int
), ‘%c
‘ (把一個int
作為一個字符插入)。到此,相信大家對“Lua中有哪些常用函數”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。