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

溫馨提示×

溫馨提示×

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

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

Lua中有哪些常用函數

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

本篇內容主要講解“Lua中有哪些常用函數”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Lua中有哪些常用函數”吧!


Lua中有哪些常用函數

lua_getallocf

lua_Alloc lua_getallocf (lua_State *L, void **ud);

返回給定狀態機的內存分配器函數。如果 ud 不是 NULL ,Lua 把調用lua_newstate 時傳入的那個指針放入*ud


lua_getfenv

void lua_getfenv (lua_State *L, int index);

把索引處值的環境表壓入堆棧。


lua_getfield

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

t[k] 值壓入堆棧,這里的 t 是指有效索引 index 指向的值。在 Lua 中,這個函數可能觸發對應 “index” 事件的元方法(參見 §2.8)。


lua_getglobal

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

把全局變量 name 里的值壓入堆棧。這個是用一個宏定義出來的:

#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, s)


lua_getmetatable

int lua_getmetatable (lua_State *L, int index);

把給定索引指向的值的元表壓入堆棧。如果索引無效,或是這個值沒有元表,函數將返回 0 并且不會向棧上壓任何東西。


lua_gettable

void lua_gettable (lua_State *L, int index);

t[k] 值壓入堆棧,這里的 t 是指有效索引 index 指向的值,而 k 則是棧頂放的值。

這個函數會彈出堆棧上的 key (把結果放在棧上相同位置)。在 Lua 中,這個函數可能觸發對應 “index” 事件的元方法(參見§2.8)。


lua_gettop

int lua_gettop (lua_State *L);

返回棧頂元素的索引。因為索引是從 1 開始編號的,所以這個結果等于堆棧上的元素個數(因此返回 0 表示堆棧為空)。


lua_insert

void lua_insert (lua_State *L, int index);

把棧頂元素插入指定的有效索引處,并依次移動這個索引之上的元素。不要用偽索引來調用這個函數,因為偽索引不是真正指向堆棧上的位置。


lua_Integer

typedef ptrdiff_t lua_Integer;

這個類型被用于 Lua API 接收整數值。

缺省時這個被定義為 ptrdiff_t ,這個東西通常是機器能處理的最大整數類型。


lua_isboolean

int lua_isboolean (lua_State *L, int index);

當給定索引的值類型為 boolean 時,返回 1 ,否則返回 0 。


lua_iscfunction

int lua_iscfunction (lua_State *L, int index);

當給定索引的值是一個 C 函數時,返回 1 ,否則返回 0 。


lua_isfunction

int lua_isfunction (lua_State *L, int index);

當給定索引的值是一個函數( C 或 Lua 函數均可)時,返回 1 ,否則返回 0 。


lua_islightuserdata

int lua_islightuserdata (lua_State *L, int index);

當給定索引的值是一個 light userdata 時,返回 1 ,否則返回 0 。


lua_isnil

int lua_isnil (lua_State *L, int index);

當給定索引的值是 nil 時,返回 1 ,否則返回 0 。


lua_isnumber

int lua_isnumber (lua_State *L, int index);

當給定索引的值是一個數字,或是一個可轉換為數字的字符串時,返回 1 ,否則返回 0 。


lua_isstring

int lua_isstring (lua_State *L, int index);

當給定索引的值是一個字符串或是一個數字(數字總能轉換成字符串)時,返回 1 ,否則返回 0 。


lua_istable

int lua_istable (lua_State *L, int index);

當給定索引的值是一個 table 時,返回 1 ,否則返回 0 。


lua_isthread

int lua_isthread (lua_State *L, int index);

當給定索引的值是一個 thread 時,返回 1 ,否則返回 0 。


lua_isuserdata

int lua_isuserdata (lua_State *L, int index);

當給定索引的值是一個 userdata (無論是完整的 userdata 還是 light userdata )時,返回 1 ,否則返回 0 。


lua_lessthan

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

如果索引 index1 處的值小于索引 index2 處的值時,返回 1 ;否則返回 0 。其語義遵循 Lua 中的 操作符(就是說,有可能調用元方法)。如果任何一個索引無效,也會返回 0 。


lua_load

int lua_load (lua_State *L, lua_Reader reader, void *data, const char *chunkname);

加載一個 Lua chunk 。如果沒有錯誤, lua_load 把一個編譯好的 chunk 作為一個 Lua 函數壓入堆棧。否則,壓入出錯信息。 lua_load 的返回值可以是:

  • 0: 沒有錯誤;
  • LUA_ERRSYNTAX: 在預編譯時碰到語法錯誤;
  • LUA_ERRMEM: 內存分配錯誤。

這個函數僅僅加栽 chunk ;而不會去運行它。

lua_load 會自動檢測 chunk 是文本的還是二進制的,然后做對應的加載操作(參見程序luac)。

lua_load 函數使用一個用戶提供的reader 函數來讀取 chunk (參見lua_Reader)。data 參數會被傳入讀取器函數。

chunkname 這個參數可以賦予 chunk 一個名字,這個名字被用于出錯信息和調試信息(參見§3.8)。


lua_newstate

lua_State *lua_newstate (lua_Alloc f, void *ud);

創建的一個新的獨立的狀態機。如果創建不了(因為內存問題)返回 NULL 。參數 f 是一個分配器函數; Lua 將通過這個函數做狀態機內所有的內存分配操作。第二個參數 ud ,這個指針將在每次調用分配器時被直接傳入。


lua_newtable

void lua_newtable (lua_State *L);

創建一個空 table ,并將之壓入堆棧。它等價于 lua_createtable(L, 0, 0)


lua_newthread

lua_State *lua_newthread (lua_State *L);

創建一個新線程,并將其壓入堆棧,并返回維護這個線程的 lua_State 指針。這個函數返回的新狀態機共享原有狀態機中的所有對象(比如一些 table),但是它有獨立的執行堆棧。

沒有顯式的函數可以用來關閉或銷毀掉一個線程。線程跟其它 Lua 對象一樣是垃圾收集的條目之一。


lua_newuserdata

void *lua_newuserdata (lua_State *L, size_t size);

這個函數分配分配一塊指定大小的內存塊,把內存塊地址作為一個完整的 userdata 壓入堆棧,并返回這個地址。

userdata 代表 Lua 中的 C 值。完整的 userdata 代表一塊內存。它是一個對象(就像 table 那樣的對象):你必須創建它,它有著自己的元表,而且它在被回收時,可以被監測到。一個完整的 userdata 只和它自己相等(在等于的原生作用下)。

當 Lua 通過 gc 元方法回收一個完整的 userdata 時, Lua 調用這個元方法并把 userdata 標記為已終止。等到這個 userdata 再次被收集的時候,Lua 會釋放掉相關的內存。


lua_next

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 造成影響。


lua_Number

typedef double lua_Number;

Lua 中數字的類型。確省是 double ,但是你可以在 luaconf.h 中修改它。

通過修改配置文件你可以改變 Lua 讓它操作其它數字類型(例如:float 或是 long )。


lua_objlen

size_t lua_objlen (lua_State *L, int index);

返回指定的索引處的值的長度。對于 string ,那就是字符串的長度;對于 table ,是取長度操作符 (‘#‘) 的結果;對于 userdata ,就是為其分配的內存塊的尺寸;對于其它值,為 0 。


lua_pcall

lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);

以保護模式調用一個函數。

nargsnresults 的含義與 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: 在運行錯誤處理函數時發生的錯誤。

lua_pop

void lua_pop (lua_State *L, int n);

從堆棧中彈出 n 個元素。


lua_pushboolean

void lua_pushboolean (lua_State *L, int b);

b 作為一個 boolean 值壓入堆棧。


lua_pushcclosure

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 也會把這些值從棧上彈出。


lua_pushcfunction

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)


lua_pushfstring

const char *lua_pushfstring (lua_State *L, const char *fmt, …);

把一個格式化過的字符串壓入堆棧,然后返回這個字符串的指針。它和 C 函數 sprintf 比較像,不過有一些重要的區別:

  • 摸你需要為結果分配空間: 其結果是一個 Lua 字符串,由 Lua 來關心其內存分配 (同時通過垃圾收集來釋放內存)。
  • 這個轉換非常的受限。 不支持 flag ,寬度,或是指定精度。 它只支持下面這些: ‘%%‘ (插入一個 ‘%‘), ‘%s‘ (插入一個帶零終止符的字符串,沒有長度限制), ‘%f‘ (插入一個lua_Number), ‘%p‘ (插入一個指針或是一個十六進制數), ‘%d‘ (插入一個int), ‘%c‘ (把一個int 作為一個字符插入)。

到此,相信大家對“Lua中有哪些常用函數”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

lua
AI

桓仁| 连城县| 尚义县| 铜陵市| 全州县| 修水县| 昌都县| 吴忠市| 彭州市| 金门县| 买车| 贵港市| 韶山市| 股票| 上栗县| 四川省| 汝南县| 喀什市| 包头市| 祁门县| 商河县| 孝昌县| 宜都市| 澄迈县| 台东市| 墨脱县| 施甸县| 兴宁市| 平果县| 卢湾区| 呼伦贝尔市| 丽水市| 宣化县| 陇南市| 驻马店市| 仙游县| 城步| 安西县| 余干县| 巴东县| 兴隆县|