您好,登錄后才能下訂單哦!
這篇文章主要介紹“Lua常用函數有哪些”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Lua常用函數有哪些”文章能幫助大家解決問題。
Lua 是一種輕量小巧的腳本語言,用標準C語言編寫并以源代碼形式開放, 其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定制功能。
void lua_pushnil (lua_State *L);
把一個 nil 壓棧。
void lua_pushnumber (lua_State *L, lua_Number n);
把一個數字 n
壓棧。
void lua_pushstring (lua_State *L, const char *s);
把指針 s
指向的以零結尾的字符串壓棧。 Lua 對這個字符串做一次內存拷貝(或是復用一個拷貝),因此s
處的內存在函數返回后,可以釋放掉或是重用于其它用途。字符串中不能包含有零字符;第一個碰到的零字符會認為是字符串的結束。
int lua_pushthread (lua_State *L);
把 L
中提供的線程壓棧。如果這個線程是當前狀態機的主線程的話,返回 1 。
void lua_pushvalue (lua_State *L, int index);
把堆棧上給定有效處索引處的元素作一個拷貝壓棧。
const char *lua_pushvfstring (lua_State *L, const char *fmt, va_list argp);
等價于 lua_pushfstring
,不過是用 va_list
接收參數,而不是用可變數量的實際參數。
int lua_rawequal (lua_State *L, int index1, int index2);
如果兩個索引 index1
和 index2
處的值簡單地相等(不調用元方法)則返回 1 。否則返回 0 。如果任何一個索引無效也返回 0 。
void lua_rawget (lua_State *L, int index);
類似于 lua_gettable
,但是作一次直接訪問(不觸發元方法)。
void lua_rawgeti (lua_State *L, int index, int n);
把 t[n]
的值壓棧,這里的 t
是指給定索引 index
處的一個值。這是一個直接訪問;就是說,它不會觸發元方法。
void lua_rawset (lua_State *L, int index);
類似于 lua_settable
,但是是作一個直接賦值(不觸發元方法)。
void lua_rawseti (lua_State *L, int index, int n);
等價于 t[n] = v
,這里的 t
是指給定索引 index
處的一個值,而 v
是棧頂的值。
函數將把這個值彈出棧。賦值操作是直接的;就是說,不會觸發元方法。
typedef const char * (*lua_Reader) (lua_State *L, void *data, size_t *size);
lua_load
用到的讀取器函數,每次它需要一塊新的 chunk 的時候,lua_load
就調用讀取器,每次都會傳入一個參數data
。讀取器需要返回含有新的 chunk 的一塊內存的指針,并把 size
設為這塊內存的大小。內存塊必須在下一次函數被調用之前一直存在。讀取器可以通過返回一個NULL
來指示 chunk 結束。讀取器可能返回多個塊,每個塊可以有任意的大于零的尺寸。
void lua_register (lua_State *L, const char *name, lua_CFunction f);
把 C 函數 f
設到全局變量 name
中。它通過一個宏定義:
#define lua_register(L,n,f) \ (lua_pushcfunction(L, f), lua_setglobal(L, n))
void lua_remove (lua_State *L, int index);
從給定有效索引處移除一個元素,把這個索引之上的所有元素移下來填補上這個空隙。不能用偽索引來調用這個函數,因為偽索引并不指向真實的棧上的位置。
void lua_replace (lua_State *L, int index);
把棧頂元素移動到給定位置(并且把這個棧頂元素彈出),不移動任何元素(因此在那個位置處的值被覆蓋掉)。
int lua_resume (lua_State *L, int narg);
在給定線程中啟動或繼續一個 coroutine 。
要啟動一個 coroutine 的話,首先你要創建一個新線程(參見 lua_newthread
);然后把主函數和若干參數壓到新線程的堆棧上;最后調用 lua_resume
,把 narg
設為參數的個數。這次調用會在 coroutine 掛起時或是結束運行后返回。當函數返回時,堆棧中會有傳給lua_yield
的所有值,或是主函數的所有返回值。如果 coroutine 切換時,lua_resume
返回LUA_YIELD
,而當 coroutine 結束運行且沒有任何錯誤時,返回 0 。如果有錯則返回錯誤代碼(參見lua_pcall
)。在發生錯誤的情況下,堆棧沒有展開,因此你可以使用 debug API 來處理它。出錯信息放在棧頂。要繼續運行一個 coroutine 的話,你把需要傳給yield
作結果的返回值壓入堆棧,然后調用lua_resume
。
void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);
把指定狀態機的分配器函數換成帶上指針 ud
的 f
。
int lua_setfenv (lua_State *L, int index);
從堆棧上彈出一個 table 并把它設為指定索引處值的新環境。如果指定索引處的值即不是函數又不是線程或是 userdata ,lua_setfenv
會返回 0 ,否則返回 1 。
void lua_setfield (lua_State *L, int index, const char *k);
做一個等價于 t[k] = v
的操作,這里 t
是給出的有效索引index
處的值,而v
是棧頂的那個值。
這個函數將把這個值彈出堆棧。跟在 Lua 中一樣,這個函數可能觸發一個 “newindex” 事件的元方法(參見§2.8)。
void lua_setglobal (lua_State *L, const char *name);
從堆棧上彈出一個值,并將其設到全局變量 name
中。它由一個宏定義出來:
#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, s)
int lua_setmetatable (lua_State *L, int index);
把一個 table 彈出堆棧,并將其設為給定索引處的值的 metatable 。
void lua_settable (lua_State *L, int index);
作一個等價于 t[k] = v
的操作,這里 t
是一個給定有效索引index
處的值,v
指棧頂的值,而 k
是棧頂之下的那個值。
這個函數會把鍵和值都從堆棧中彈出。和在 Lua 中一樣,這個函數可能觸發 “newindex” 事件的元方法(參見§2.8)。
void lua_settop (lua_State *L, int index);
參數允許傳入任何可接受的索引以及 0 。它將把堆棧的棧頂設為這個索引。如果新的棧頂比原來的大,超出部分的新元素將被填為nil 。如果index
為 0 ,把棧上所有元素移除。
typedef struct lua_State lua_State;
一個不透明的結構,它保存了整個 Lua 解釋器的狀態。 Lua 庫是完全可重入的:它沒有任何全局變量。(譯注:從 C 語法上來說,也不盡然。例如,在 table 的實現中用了一個靜態全局變量 dummynode_ ,但這在正確使用時并不影響可重入性。只是萬一你錯誤鏈接了 lua 庫,不小心在同一進程空間中存在兩份 lua 庫實現的代碼的話,多份 dummynode_ 不同的地址會導致一些問題。)所有的信息都保存在這個結構中。
這個狀態機的指針必須作為第一個參數傳遞給每一個庫函數。 lua_newstate
是一個例外,這個函數會從頭創建一個 Lua 狀態機。
int lua_status (lua_State *L);
返回線程 L
的狀態。
正常的線程狀態是 0 。當線程執行完畢或發生一個錯誤時,狀態值是錯誤碼。如果線程被掛起,狀態為 LUA_YIELD
。
int lua_toboolean (lua_State *L, int index);
把指定的索引處的的 Lua 值轉換為一個 C 中的 boolean 值( 0 或是 1 )。和 Lua 中做的所有測試一樣,lua_toboolean
會把任何不同于false 和nil 的值當作 1 返回;否則就返回 0 。如果用一個無效索引去調用也會返回 0 。(如果你想只接收真正的 boolean 值,就需要使用lua_isboolean
來測試值的類型。)
lua_CFunction lua_tocfunction (lua_State *L, int index);
把給定索引處的 Lua 值轉換為一個 C 函數。這個值必須是一個 C 函數;如果不是就返回 NULL
。
lua_Integer lua_tointeger (lua_State *L, int idx);
把給定索引處的 Lua 值轉換為 lua_Integer
這樣一個有符號整數類型。這個 Lua 值必須是一個數字或是一個可以轉換為數字的字符串(參見 §2.2.1);否則,lua_tointeger
返回 0 。
如果數字不是一個整數,截斷小數部分的方式沒有被明確定義。
const char *lua_tolstring (lua_State *L, int index, size_t *len);
把給定索引處的 Lua 值轉換為一個 C 字符串。如果 len
不為 NULL
,它還把字符串長度設到*len
中。這個 Lua 值必須是一個字符串或是一個數字;否則返回返回NULL
。如果值是一個數字,lua_tolstring
還會把堆棧中的那個值的實際類型轉換為一個字符串。(當遍歷一個表的時候,把lua_tolstring
作用在鍵上,這個轉換有可能導致lua_next
弄錯。)
lua_tolstring
返回 Lua 狀態機中字符串的以對齊指針。這個字符串總能保證 ( C 要求的)最后一個字符為零 (‘\0
‘) ,而且它允許在字符串內包含多個這樣的零。因為 Lua 中可能發生垃圾收集,所以不保證lua_tolstring
返回的指針,在對應的值從堆棧中移除后依然有效。
lua_Number lua_tonumber (lua_State *L, int index);
把給定索引處的 Lua 值轉換為 lua_Number
這樣一個 C 類型(參見 lua_Number
)。這個 Lua 值必須是一個數字或是一個可轉換為數字的字符串(參見 §2.2.1 );否則,lua_tonumber
返回 0 。
const void *lua_topointer (lua_State *L, int index);
把給定索引處的值轉換為一般的 C 指針 (void*
) 。這個值可以是一個 userdata ,table ,thread 或是一個 function ;否則,lua_topointer
返回NULL
。不同的對象有不同的指針。不存在把指針再轉回原有類型的方法。
這個函數通常只為產生 debug 信息用。
const char *lua_tostring (lua_State *L, int index);
等價于 lua_tolstring
,而參數 len
設為 NULL
。
lua_State *lua_tothread (lua_State *L, int index);
把給定索引處的值轉換為一個 Lua 線程(由 lua_State*
代表)。這個值必須是一個線程;否則函數返回NULL
。
void *lua_touserdata (lua_State *L, int index);
如果給定索引處的值是一個完整的 userdata ,函數返回內存塊的地址。如果值是一個 light userdata ,那么就返回它表示的指針。否則,返回NULL
。
int lua_type (lua_State *L, int index);
返回給定索引處的值的類型,當索引無效時則返回 LUA_TNONE
(那是指一個指向堆棧上的空位置的索引)。lua_type
返回的類型是一些個在lua.h
中定義的常量:LUA_TNIL
, LUA_TNUMBER
, LUA_TBOOLEAN
, LUA_TSTRING
, LUA_TTABLE
, LUA_TFUNCTION
, LUA_TUSERDATA
, LUA_TTHREAD
, LUA_TLIGHTUSERDATA
。
const char *lua_typename (lua_State *L, int tp);
返回 tp
表示的類型名,這個 tp
必須是 lua_type
可能返回的值中之一。
typedef int (lua_Writer) (lua_State L, const void p, size_t sz, void ud);
由 lua_dump
用到的寫入器函數。每次 lua_dump
產生了一塊新的 chunk ,它都會調用寫入器。傳入要寫入的緩存 (p
) 和它的尺寸 (sz
) ,還有lua_dump
的參數data
。
寫入器會返回一個錯誤碼: 0 表示沒有錯誤;別的值均表示一個錯誤,并且會讓 lua_dump
停止再次調用寫入器。
void lua_xmove (lua_State *from, lua_State *to, int n);
傳遞 同一個 全局狀態機下不同線程中的值。
這個函數會從 from
的堆棧中彈出 n
個值,然后把它們壓入to
的堆棧中。
int lua_yield (lua_State *L, int nresults);
切出一個 coroutine 。
這個函數只能在一個 C 函數的返回表達式中調用。如下:
return lua_yield (L, nresults);
當一個 C 函數這樣調用 lua_yield
,正在運行中的 coroutine 將從運行中掛起,然后啟動這個 coroutine 用的那次對 lua_resume
的調用就返回了。參數 nresults
指的是堆棧中需要返回的結果個數,這些返回值將被傳遞給lua_resume
。
Lua 沒有內建的調試設施。取而代之的是提供了一些函數接口和鉤子。利用這些接口,可以做出一些不同類型的調試器,性能分析器,或是其它一些需要從解釋器中取到“內部信息”的工具。
typedef struct lua_Debug { int event; const char name; / (n) */ const char namewhat; / (n) */ const char what; / (S) */ const char source; / (S) / int currentline; / (l) / int nups; / (u) upvalue 個數 / int linedefined; / (S) / int lastlinedefined; / (S) / char short_src[LUA_IDSIZE]; / (S) / / 私有部分 */ 其它域 } lua_Debug;
一個用來攜帶活動中函數的各種信息的結構。 lua_getstack
僅填寫這個結構中的私有部分,這些部分以后會用到。調用 lua_getinfo
則可以填上 lua_Debug
中有用信息的那些域。
lua_Debug
中的各個域有下列含義:
source
: 如果函數是定義在一個字符串中,source
就是這個字符串。 如果函數定義在一個文件中,source
是一個以 ‘@
‘ 開頭的文件名。short_src
: 一個“可打印版本”的 source
,用于出錯信息。linedefined
: 函數定義開始處的行號。lastlinedefined
: 函數定義結束處的行號。what
: 如果函數是一個 Lua 函數,則為一個字符串 "Lua"
; 如果是一個 C 函數,則為"C"
; 如果它是一個 chunk 的主體部分,則為"main"
; 如果是一個作了尾調用的函數,則為 "tail"
。 別的情況下,Lua 沒有關于函數的別的信息。currentline
: 給定函數正在執行的那一行。 當提供不了行號信息的時候,currentline
被設為 -1 。name
: 給定函數的一個合理的名字。 因為 Lua 中的函數也是一個值, 所以它們沒有固定的名字: 一些函數可能是全局復合變量的值, 另一些可能僅僅只是被保存在一個 table 中。lua_getinfo
函數會檢查函數是這樣被調用的,以此來找到一個適合的名字。 如果它找不到名字,name
就被設置為NULL
。namewhat
: 結實 name
域。 namewhat
的值可以是"global"
,"local"
, "method"
, "field"
,"upvalue"
, 或是""
(空串)。 這取決于函數怎樣被調用。 (Lua 用空串表示其它選項都不符合)nups
: 函數的 upvalue 的個數。lua_Hook lua_gethook (lua_State *L);
返回當前的鉤子函數。
int lua_gethookcount (lua_State *L);
返回當前鉤子記數。
int lua_gethookmask (lua_State *L);
返回當前的鉤子掩碼 (mask) 。
int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);
返回一個指定的函數或函數調用的信息。
當用于取得一次函數調用的信息時,參數 ar
必須是一個有效的活動的記錄。這條記錄可以是前一次調用lua_getstack
得到的,或是一個鉤子 (參見lua_Hook
)得到的參數。
用于獲取一個函數的信息時,可以把這個函數壓入堆棧,然后把 what
字符串以字符 ‘>
‘ 起頭。(這個情況下,lua_getinfo
從棧頂上彈出函數。)例如,想知道函數f
在哪一行定義的,你可以下下列代碼:
lua_Debug ar; lua_getfield(L, LUA_GLOBALSINDEX, “f”); /* 取到全局變量 ‘f’ */ lua_getinfo(L, “>S”, &ar); printf(“%d\n”, ar.linedefined);
what
字符串中的每個字符都篩選出結構 ar
結構中一些域用于填充,或是把一個值壓入堆棧:
n
‘: 填充 name
及 namewhat
域;S
‘: 填充 source
, short_src
,linedefined
,lastlinedefined
,以及 what
域;l
‘: 填充 currentline
域;u
‘: 填充 nups
域;f
‘: 把正在運行中指定級別處函數壓入堆棧; (譯注:一般用于獲取函數調用中的信息, 級別是由 ar 中的私有部分來提供。 如果用于獲取靜態函數,那么就直接把指定函數重新壓回堆棧, 但這樣做通常無甚意義。)L
‘: 壓一個 table 入棧,這個 table 中的整數索引用于描述函數中哪些行是有效行。 (有效行指有實際代碼的行, 即你可以置入斷點的行。 無效行包括空行和只有注釋的行。)這個函數出錯會返回 0 (例如,what
中有一個無效選項)。
const char *lua_getlocal (lua_State *L, lua_Debug *ar, int n);
從給定活動記錄中獲取一個局部變量的信息。參數 ar
必須是一個有效的活動的記錄。這條記錄可以是前一次調用lua_getstack
得到的,或是一個鉤子 (參見lua_Hook
)得到的參數。索引n
用于選擇要檢閱哪個局部變量( 1 表示第一個參數或是激活的第一個局部變量,以此類推,直到最后一個局部變量)。 lua_getlocal
把變量的值壓入堆棧并返回它的名字。
以 ‘(‘ (正小括號)開始的變量指內部變量(循環控制變量,臨時變量,C 函數局部變量)。
當索引大于局部變量的個數時,返回 NULL
(什么也不壓入)。
int lua_getstack (lua_State *L, int level, lua_Debug *ar);
獲取解釋器的運行時棧的信息。
這個函數用正在運行中的給定級別處的函數的活動記錄來填寫 lua_Debug
結構的一部分。 0 級表示當前運行的函數,而 n+1 級處的函數就是調用第 n 級函數的那一個。如果沒有錯誤,lua_getstack
返回 1 ;當調用傳入的級別大于堆棧深度的時候,返回 0 。
const char *lua_getupvalue (lua_State *L, int funcindex, int n);
獲取一個 closure 的 upvalue 信息。(對于 Lua 函數,upvalue 是函數需要使用的外部局部變量,因此這些變量被包含在 closure 中。)lua_getupvalue
獲取第n
個 upvalue ,把這個 upvalue 的值壓入堆棧,并且返回它的名字。 funcindex
指向堆棧上 closure 的位置。( 因為 upvalue 在整個函數中都有效,所以它們沒有特別的次序。因此,它們以字母次序來編號。)
當索引號比 upvalue 數量大的時候,返回 NULL
(而且不會壓入任何東西)對于 C 函數,這個函數用空串""
表示所有 upvalue 的名字。
typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
用于調試的鉤子函數類型。
無論何時鉤子被調用,它的參數 ar
中的 event
域都被設為觸發鉤子的事件。 Lua 把這些事件定義為以下常量:LUA_HOOKCALL
,LUA_HOOKRET
, LUA_HOOKTAILRET
,LUA_HOOKLINE
, andLUA_HOOKCOUNT
。除此之外,對于 line 事件,currentline
域也被設置。要想獲得ar
中的其他域,鉤子必須調用lua_getinfo
。對于返回事件,event
的正常值可能是LUA_HOOKRET
,或者是LUA_HOOKTAILRET
。對于后一種情況,Lua 會對一個函數做的尾調用也模擬出一個返回事件出來;對于這個模擬的返回事件,調用lua_getinfo
沒有什么作用。
當 Lua 運行在一個鉤子內部時,它將屏蔽掉其它對鉤子的調用。也就是說,如果一個鉤子函數內再調回 Lua 來執行一個函數或是一個 chunk ,這個執行操作不會觸發任何的鉤子。
int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);
設置一個調試用鉤子函數。
參數 f
是鉤子函數。 mask
指定在哪些事件時會調用:它由下列一組位常量構成LUA_MASKCALL
,LUA_MASKRET
, LUA_MASKLINE
,以及LUA_MASKCOUNT
。參數count
只在 mask 中包含有LUA_MASKCOUNT
才有意義。對于每個事件,鉤子被調用的情況解釋如下:
count
條指令后被調用。 (這個事件僅僅在 Lua 執行一個 Lua 函數時發生。)鉤子可以通過設置 mask
為零屏蔽。
const char *lua_setlocal (lua_State *L, lua_Debug *ar, int n);
設置給定活動記錄中的局部變量的值。參數 ar
與 n
和 lua_getlocal
中的一樣(參見 lua_getlocal
)。 lua_setlocal
把棧頂的值賦給變量然后返回變量的名字。它會將值從棧頂彈出。
當索引大于局部變量的個數時,返回 NULL
(什么也不彈出)。
const char *lua_setupvalue (lua_State *L, int funcindex, int n);
設置 closure 的 upvalue 的值。它把棧頂的值彈出并賦于 upvalue 并返回 upvalue 的名字。參數funcindex
與 n
和 lua_getupvalue
中的一樣(參見 lua_getupvalue
)。
當索引大于 upvalue 的個數時,返回 NULL
(什么也不彈出)。
關于“Lua常用函數有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。