91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Lua常用函數有哪些

發布時間:2022-01-20 16:23:22 來源:億速云 閱讀:563 作者:iii 欄目:開發技術

這篇文章主要介紹“Lua常用函數有哪些”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Lua常用函數有哪些”文章能幫助大家解決問題。

Lua 是一種輕量小巧的腳本語言,用標準C語言編寫并以源代碼形式開放, 其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定制功能。

Lua常用函數有哪些

lua_pushnil

void lua_pushnil (lua_State *L);

把一個 nil 壓棧。


lua_pushnumber

void lua_pushnumber (lua_State *L, lua_Number n);

把一個數字 n 壓棧。


lua_pushstring

void lua_pushstring (lua_State *L, const char *s);

把指針 s 指向的以零結尾的字符串壓棧。 Lua 對這個字符串做一次內存拷貝(或是復用一個拷貝),因此s 處的內存在函數返回后,可以釋放掉或是重用于其它用途。字符串中不能包含有零字符;第一個碰到的零字符會認為是字符串的結束。


lua_pushthread

int lua_pushthread (lua_State *L);

L 中提供的線程壓棧。如果這個線程是當前狀態機的主線程的話,返回 1 。


lua_pushvalue

void lua_pushvalue (lua_State *L, int index);

把堆棧上給定有效處索引處的元素作一個拷貝壓棧。


lua_pushvfstring

const char *lua_pushvfstring (lua_State *L, const char *fmt, va_list argp);

等價于 lua_pushfstring,不過是用 va_list 接收參數,而不是用可變數量的實際參數。


lua_rawequal

int lua_rawequal (lua_State *L, int index1, int index2);

如果兩個索引 index1index2 處的值簡單地相等(不調用元方法)則返回 1 。否則返回 0 。如果任何一個索引無效也返回 0 。


lua_rawget

void lua_rawget (lua_State *L, int index);

類似于 lua_gettable,但是作一次直接訪問(不觸發元方法)。


lua_rawgeti

void lua_rawgeti (lua_State *L, int index, int n);

t[n] 的值壓棧,這里的 t 是指給定索引 index 處的一個值。這是一個直接訪問;就是說,它不會觸發元方法。


lua_rawset

void lua_rawset (lua_State *L, int index);

類似于 lua_settable,但是是作一個直接賦值(不觸發元方法)。


lua_rawseti

void lua_rawseti (lua_State *L, int index, int n);

等價于 t[n] = v,這里的 t 是指給定索引 index 處的一個值,而 v 是棧頂的值。

函數將把這個值彈出棧。賦值操作是直接的;就是說,不會觸發元方法。


lua_Reader

typedef const char * (*lua_Reader) (lua_State *L, void *data, size_t *size);

lua_load 用到的讀取器函數,每次它需要一塊新的 chunk 的時候,lua_load 就調用讀取器,每次都會傳入一個參數data 。讀取器需要返回含有新的 chunk 的一塊內存的指針,并把 size 設為這塊內存的大小。內存塊必須在下一次函數被調用之前一直存在。讀取器可以通過返回一個NULL 來指示 chunk 結束。讀取器可能返回多個塊,每個塊可以有任意的大于零的尺寸。


lua_register

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))


lua_remove

void lua_remove (lua_State *L, int index);

從給定有效索引處移除一個元素,把這個索引之上的所有元素移下來填補上這個空隙。不能用偽索引來調用這個函數,因為偽索引并不指向真實的棧上的位置。


lua_replace

void lua_replace (lua_State *L, int index);

把棧頂元素移動到給定位置(并且把這個棧頂元素彈出),不移動任何元素(因此在那個位置處的值被覆蓋掉)。


lua_resume

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


lua_setallocf

void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);

把指定狀態機的分配器函數換成帶上指針 udf


lua_setfenv

int lua_setfenv (lua_State *L, int index);

從堆棧上彈出一個 table 并把它設為指定索引處值的新環境。如果指定索引處的值即不是函數又不是線程或是 userdata ,lua_setfenv 會返回 0 ,否則返回 1 。


lua_setfield

void lua_setfield (lua_State *L, int index, const char *k);

做一個等價于 t[k] = v 的操作,這里 t 是給出的有效索引index 處的值,而v 是棧頂的那個值。

這個函數將把這個值彈出堆棧。跟在 Lua 中一樣,這個函數可能觸發一個 “newindex” 事件的元方法(參見§2.8)。


lua_setglobal

void lua_setglobal (lua_State *L, const char *name);

從堆棧上彈出一個值,并將其設到全局變量 name 中。它由一個宏定義出來:

#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, s)


lua_setmetatable

int lua_setmetatable (lua_State *L, int index);

把一個 table 彈出堆棧,并將其設為給定索引處的值的 metatable 。


lua_settable

void lua_settable (lua_State *L, int index);

作一個等價于 t[k] = v 的操作,這里 t 是一個給定有效索引index 處的值,v 指棧頂的值,而 k 是棧頂之下的那個值。

這個函數會把鍵和值都從堆棧中彈出。和在 Lua 中一樣,這個函數可能觸發 “newindex” 事件的元方法(參見§2.8)。


lua_settop

void lua_settop (lua_State *L, int index);

參數允許傳入任何可接受的索引以及 0 。它將把堆棧的棧頂設為這個索引。如果新的棧頂比原來的大,超出部分的新元素將被填為nil 。如果index 為 0 ,把棧上所有元素移除。


lua_State

typedef struct lua_State lua_State;

一個不透明的結構,它保存了整個 Lua 解釋器的狀態。 Lua 庫是完全可重入的:它沒有任何全局變量。(譯注:從 C 語法上來說,也不盡然。例如,在 table 的實現中用了一個靜態全局變量 dummynode_ ,但這在正確使用時并不影響可重入性。只是萬一你錯誤鏈接了 lua 庫,不小心在同一進程空間中存在兩份 lua 庫實現的代碼的話,多份 dummynode_ 不同的地址會導致一些問題。)所有的信息都保存在這個結構中。

這個狀態機的指針必須作為第一個參數傳遞給每一個庫函數。 lua_newstate 是一個例外,這個函數會從頭創建一個 Lua 狀態機。


lua_status

int lua_status (lua_State *L);

返回線程 L 的狀態。

正常的線程狀態是 0 。當線程執行完畢或發生一個錯誤時,狀態值是錯誤碼。如果線程被掛起,狀態為 LUA_YIELD


lua_toboolean

int lua_toboolean (lua_State *L, int index);

把指定的索引處的的 Lua 值轉換為一個 C 中的 boolean 值( 0 或是 1 )。和 Lua 中做的所有測試一樣,lua_toboolean 會把任何不同于falsenil 的值當作 1 返回;否則就返回 0 。如果用一個無效索引去調用也會返回 0 。(如果你想只接收真正的 boolean 值,就需要使用lua_isboolean 來測試值的類型。)


lua_tocfunction

lua_CFunction lua_tocfunction (lua_State *L, int index);

把給定索引處的 Lua 值轉換為一個 C 函數。這個值必須是一個 C 函數;如果不是就返回 NULL


lua_tointeger

lua_Integer lua_tointeger (lua_State *L, int idx);

把給定索引處的 Lua 值轉換為 lua_Integer 這樣一個有符號整數類型。這個 Lua 值必須是一個數字或是一個可以轉換為數字的字符串(參見 §2.2.1);否則,lua_tointeger 返回 0 。

如果數字不是一個整數,截斷小數部分的方式沒有被明確定義。


lua_tolstring

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_tonumber

lua_Number lua_tonumber (lua_State *L, int index);

把給定索引處的 Lua 值轉換為 lua_Number 這樣一個 C 類型(參見 lua_Number )。這個 Lua 值必須是一個數字或是一個可轉換為數字的字符串(參見 §2.2.1 );否則,lua_tonumber 返回 0 。


lua_topointer

const void *lua_topointer (lua_State *L, int index);

把給定索引處的值轉換為一般的 C 指針 (void*) 。這個值可以是一個 userdata ,table ,thread 或是一個 function ;否則,lua_topointer 返回NULL 。不同的對象有不同的指針。不存在把指針再轉回原有類型的方法。

這個函數通常只為產生 debug 信息用。


lua_tostring

const char *lua_tostring (lua_State *L, int index);

等價于 lua_tolstring ,而參數 len 設為 NULL


lua_tothread

lua_State *lua_tothread (lua_State *L, int index);

把給定索引處的值轉換為一個 Lua 線程(由 lua_State* 代表)。這個值必須是一個線程;否則函數返回NULL


lua_touserdata

void *lua_touserdata (lua_State *L, int index);

如果給定索引處的值是一個完整的 userdata ,函數返回內存塊的地址。如果值是一個 light userdata ,那么就返回它表示的指針。否則,返回NULL


lua_type

int lua_type (lua_State *L, int index);

返回給定索引處的值的類型,當索引無效時則返回 LUA_TNONE (那是指一個指向堆棧上的空位置的索引)。lua_type 返回的類型是一些個在lua.h 中定義的常量:LUA_TNILLUA_TNUMBERLUA_TBOOLEANLUA_TSTRINGLUA_TTABLELUA_TFUNCTIONLUA_TUSERDATALUA_TTHREADLUA_TLIGHTUSERDATA


lua_typename

const char *lua_typename (lua_State *L, int tp);

返回 tp 表示的類型名,這個 tp 必須是 lua_type 可能返回的值中之一。


lua_Writer

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 停止再次調用寫入器。


lua_xmove

void lua_xmove (lua_State *from, lua_State *to, int n);

傳遞 同一個 全局狀態機下不同線程中的值。

這個函數會從 from 的堆棧中彈出 n 個值,然后把它們壓入to 的堆棧中。


lua_yield

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

3.8 – 調試接口

Lua 沒有內建的調試設施。取而代之的是提供了一些函數接口和鉤子。利用這些接口,可以做出一些不同類型的調試器,性能分析器,或是其它一些需要從解釋器中取到“內部信息”的工具。


lua_Debug

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_gethook

lua_Hook lua_gethook (lua_State *L);

返回當前的鉤子函數。


lua_gethookcount

int lua_gethookcount (lua_State *L);

返回當前鉤子記數。


lua_gethookmask

int lua_gethookmask (lua_State *L);

返回當前的鉤子掩碼 (mask) 。


lua_getinfo

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‘: 填充 namenamewhat 域;
  • ‘S‘: 填充 sourceshort_srclinedefinedlastlinedefined,以及 what 域;
  • ‘l‘: 填充 currentline 域;
  • ‘u‘: 填充 nups 域;
  • ‘f‘: 把正在運行中指定級別處函數壓入堆棧; (譯注:一般用于獲取函數調用中的信息, 級別是由 ar 中的私有部分來提供。 如果用于獲取靜態函數,那么就直接把指定函數重新壓回堆棧, 但這樣做通常無甚意義。)
  • ‘L‘: 壓一個 table 入棧,這個 table 中的整數索引用于描述函數中哪些行是有效行。 (有效行指有實際代碼的行, 即你可以置入斷點的行。 無效行包括空行和只有注釋的行。)

這個函數出錯會返回 0 (例如,what 中有一個無效選項)。


lua_getlocal

const char *lua_getlocal (lua_State *L, lua_Debug *ar, int n);

從給定活動記錄中獲取一個局部變量的信息。參數 ar 必須是一個有效的活動的記錄。這條記錄可以是前一次調用lua_getstack 得到的,或是一個鉤子 (參見lua_Hook)得到的參數。索引n 用于選擇要檢閱哪個局部變量( 1 表示第一個參數或是激活的第一個局部變量,以此類推,直到最后一個局部變量)。 lua_getlocal 把變量的值壓入堆棧并返回它的名字。

以 ‘(‘ (正小括號)開始的變量指內部變量(循環控制變量,臨時變量,C 函數局部變量)。

當索引大于局部變量的個數時,返回 NULL (什么也不壓入)。


lua_getstack

int lua_getstack (lua_State *L, int level, lua_Debug *ar);

獲取解釋器的運行時棧的信息。

這個函數用正在運行中的給定級別處的函數的活動記錄來填寫 lua_Debug 結構的一部分。 0 級表示當前運行的函數,而 n+1 級處的函數就是調用第 n 級函數的那一個。如果沒有錯誤,lua_getstack 返回 1 ;當調用傳入的級別大于堆棧深度的時候,返回 0 。


lua_getupvalue

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 的名字。


lua_Hook

typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);

用于調試的鉤子函數類型。

無論何時鉤子被調用,它的參數 ar 中的 event 域都被設為觸發鉤子的事件。 Lua 把這些事件定義為以下常量:LUA_HOOKCALLLUA_HOOKRET, LUA_HOOKTAILRETLUA_HOOKLINE, andLUA_HOOKCOUNT。除此之外,對于 line 事件,currentline 域也被設置。要想獲得ar 中的其他域,鉤子必須調用lua_getinfo。對于返回事件,event 的正常值可能是LUA_HOOKRET,或者是LUA_HOOKTAILRET 。對于后一種情況,Lua 會對一個函數做的尾調用也模擬出一個返回事件出來;對于這個模擬的返回事件,調用lua_getinfo 沒有什么作用。

當 Lua 運行在一個鉤子內部時,它將屏蔽掉其它對鉤子的調用。也就是說,如果一個鉤子函數內再調回 Lua 來執行一個函數或是一個 chunk ,這個執行操作不會觸發任何的鉤子。


lua_sethook

int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);

設置一個調試用鉤子函數。

參數 f 是鉤子函數。 mask 指定在哪些事件時會調用:它由下列一組位常量構成LUA_MASKCALLLUA_MASKRETLUA_MASKLINE,以及LUA_MASKCOUNT。參數count 只在 mask 中包含有LUA_MASKCOUNT 才有意義。對于每個事件,鉤子被調用的情況解釋如下:

  • call hook: 在解釋器調用一個函數時被調用。 鉤子將于 Lua 進入一個新函數后,函數獲取參數前被調用。
  • return hook: 在解釋器從一個函數中返回時調用。 鉤子將于 Lua 離開函數之前的那一刻被調用。 你無權訪問被函數返回出去的那些值。(譯注:原文 (You have no access to the values to be returned by the function) 如此。 但“無權訪問”一詞值得商榷。 某些情況下你可以訪問到一些被命名為 (*temporary) 的局部變量, 那些索引被排在最后的 (*temporary) 變量指的就是返回值。 但是由于 Lua 對特殊情況做了一些優化,比如直接返回一個被命名的局部變量, 那么就找不到對應的 (*temporary) 變量了。本質上,返回值一定存在于此刻的局部變量中, 并且可以訪問它,只是無法確定是哪些罷了。至于這個時候函數體內的其它局部變量, 是不保證有效的。進入 return hook 的那一刻起,實際已經退出函數內部的運行環節, 返回值占用的局部變量空間以后的部分,都有可能因 hook 本身復用它們而改變。)
  • line hook: 在解釋器準備開始執行新的一行代碼時, 或是跳轉到這行代碼中時(即使在同一行內跳轉)被調用。 (這個事件僅僅在 Lua 執行一個 Lua 函數時發生。)
  • count hook: 在解釋器每執行 count 條指令后被調用。 (這個事件僅僅在 Lua 執行一個 Lua 函數時發生。)

鉤子可以通過設置 mask 為零屏蔽。

lua_setlocal

const char *lua_setlocal (lua_State *L, lua_Debug *ar, int n);

設置給定活動記錄中的局部變量的值。參數 arnlua_getlocal 中的一樣(參見 lua_getlocal)。 lua_setlocal 把棧頂的值賦給變量然后返回變量的名字。它會將值從棧頂彈出。

當索引大于局部變量的個數時,返回 NULL (什么也不彈出)。


lua_setupvalue

const char *lua_setupvalue (lua_State *L, int funcindex, int n);

設置 closure 的 upvalue 的值。它把棧頂的值彈出并賦于 upvalue 并返回 upvalue 的名字。參數funcindexnlua_getupvalue 中的一樣(參見 lua_getupvalue)。

當索引大于 upvalue 的個數時,返回 NULL (什么也不彈出)。

關于“Lua常用函數有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

lua
AI

视频| 福泉市| 宁海县| 英吉沙县| 峨山| 萨嘎县| 黄浦区| 巴塘县| 南澳县| 绍兴市| 清河县| 永福县| 临漳县| 常德市| 福海县| 焉耆| 乌拉特后旗| 建水县| 尖扎县| 来安县| 婺源县| 五华县| 德格县| 镇平县| 濮阳市| 临朐县| 凤翔县| 定日县| 蓝田县| 上饶市| 天津市| 伊宁县| 祁东县| 镶黄旗| 九寨沟县| 临沭县| 凌海市| 元阳县| 阿鲁科尔沁旗| 敖汉旗| 肇庆市|