<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 5 – 輔助庫 _輔助庫_ 提供了一些便捷函數,方便在 C 中為 Lua 編程。 基礎 API 提供了 C 和 Lua 交互用的主要函數, 而輔助庫則為一些常見的任務提供了高階函數。 所有輔助庫中的函數和類型都定義在頭文件 `lauxlib.h` 中, 它們均帶有前綴 `luaL_`。 輔助庫中的所有函數都基于基礎 API 實現。 故而它們并沒有提供任何基礎 API 實現不了的功能。 雖然如此,使用輔助庫可以讓你的代碼更為健壯。 一些輔助庫函數會在內部使用一些額外的棧空間。 當輔助庫使用的棧空間少于五個時, 它們不去檢查棧大小;而是簡單的假設棧夠用。 一些輔助庫中的函數用于檢查 C 函數的參數。 因為錯誤信息格式化為指代參數 (例如,"`bad argument #1`"), 你就不要把這些函數用于參數之外的值了。 如果檢查無法通過, `luaL_check*` 這些函數一定會拋出錯誤。 ## 5.1 – 函數和類型 這里我們按字母表次序列出了輔助庫中的所有函數和類型。 ### `luaL_addchar` [-?, +?, _e_] ``` void luaL_addchar (luaL_Buffer *B, char c); ``` 向緩存 `B` (參見 [`luaL_Buffer`](#luaL_Buffer) ) 添加一個字節 `c`。 ### `luaL_addlstring` [-?, +?, _e_] ``` void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l); ``` 向緩存 `B` (參見 [`luaL_Buffer`](#luaL_Buffer) ) 添加一個長度為 `l` 的字符串 `s`。 這個字符串可以包含零。 ### `luaL_addsize` [-?, +?, _e_] ``` void luaL_addsize (luaL_Buffer *B, size_t n); ``` 向緩存 `B` (參見 [`luaL_Buffer`](#luaL_Buffer) ) 添加一個已在之前復制到緩沖區(參見 [`luaL_prepbuffer`](#luaL_prepbuffer)) 的長度為 `n` 的字符串。 ### `luaL_addstring` [-?, +?, _e_] ``` void luaL_addstring (luaL_Buffer *B, const char *s); ``` 向緩存 `B` (參見 [`luaL_Buffer`](#luaL_Buffer) ) 添加一個零結尾的字符串 `s`。 ### `luaL_addvalue` [-1, +?, _e_] ``` void luaL_addvalue (luaL_Buffer *B); ``` 向緩存 `B` (參見 [`luaL_Buffer`](#luaL_Buffer) ) 添加棧頂的一個值,隨后將其彈出。 這個函數是操作字符串緩存的函數中,唯一一個會(且必須)在棧上放置額外元素的。 這個元素將被加入緩存。 ### `luaL_argcheck` [-0, +0, _v_] ``` void luaL_argcheck (lua_State *L, int cond, int arg, const char *extramsg); ``` 檢查 `cond` 是否為真。 如果不為真,以標準信息形式拋出一個錯誤 (參見 [`luaL_argerror`](#luaL_argerror))。 ### `luaL_argerror` [-0, +0, _v_] ``` int luaL_argerror (lua_State *L, int arg, const char *extramsg); ``` 拋出一個錯誤報告調用的 C 函數的第 `arg` 個參數的問題。 它使用下列標準信息并包含了一段 `extramsg` 作為注解: ``` bad argument #_arg_ to '_funcname_' (_extramsg_) ``` 這個函數永遠不會返回。 ### `luaL_Buffer` ``` typedef struct luaL_Buffer luaL_Buffer; ``` _字符串緩存_ 的類型。 字符串緩存可以讓 C 代碼分段構造一個 Lua 字符串。 使用模式如下: * 首先定義一個類型為 [`luaL_Buffer`](#luaL_Buffer) 的變量 `b`。 * 調用 `luaL_buffinit(L, &b)` 初始化它。 * 然后調用 `luaL_add*` 這組函數向其添加字符串片斷。 * 最后調用 `luaL_pushresult(&b)` 。 最后這次調用會在棧頂留下最終的字符串。 如果你預先知道結果串的長度, 你可以這樣使用緩存: * 首先定義一個類型為 [`luaL_Buffer`](#luaL_Buffer) 的變量 `b`。 * 然后調用 `luaL_buffinitsize(L, &b, sz)` 預分配 `sz` 大小的空間。 * 接著將字符串復制入這個空間。 * 最后調用 `luaL_pushresultsize(&b, sz)`, 這里的 `sz` 指已經復制到緩存內的字符串長度。 一般的操作過程中,字符串緩存會使用不定量的棧槽。 因此,在使用緩存中,你不能假定目前棧頂在哪。 在對緩存操作的函數調用間,你都可以使用棧,只需要保證棧平衡即可; 即,在你做一次緩存操作調用時,當時的棧位置和上次調用緩存操作后的位置相同。 (對于 [`luaL_addvalue`](#luaL_addvalue) 是個唯一的例外。) 在調用完 [`luaL_pushresult`](#luaL_pushresult) 后, 棧會恢復到緩存初始化時的位置上,并在頂部壓入最終的字符串。 ### `luaL_buffinit` [-0, +0, –] ``` void luaL_buffinit (lua_State *L, luaL_Buffer *B); ``` 初始化緩存 `B`。 這個函數不會分配任何空間; 緩存必須以一個變量的形式聲明 (參見 [`luaL_Buffer`](#luaL_Buffer))。 ### `luaL_buffinitsize` [-?, +?, _e_] ``` char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz); ``` 等價于調用序列 [`luaL_buffinit`](#luaL_buffinit), [`luaL_prepbuffsize`](#luaL_prepbuffsize)。 ### `luaL_callmeta` [-0, +(0|1), _e_] ``` int luaL_callmeta (lua_State *L, int obj, const char *e); ``` 調用一個元方法。 如果在索引 `obj` 處的對象有元表, 且元表有域 `e` 。 這個函數會以該對象為參數調用這個域。 這種情況下,函數返回真并將調用返回值壓棧。 如果那個位置沒有元表,或沒有對應的元方法, 此函數返回假(并不會將任何東西壓棧)。 ### `luaL_checkany` [-0, +0, _v_] ``` void luaL_checkany (lua_State *L, int arg); ``` 檢查函數在 `arg` 位置是否有任何類型(包括 **nil**)的參數。 ### `luaL_checkinteger` [-0, +0, _v_] ``` lua_Integer luaL_checkinteger (lua_State *L, int arg); ``` 檢查函數的第 `arg` 個參數是否是一個 整數(或是可以被轉換為一個整數) 并以 [`lua_Integer`](#lua_Integer) 類型返回這個整數值。 ### `luaL_checklstring` [-0, +0, _v_] ``` const char *luaL_checklstring (lua_State *L, int arg, size_t *l); ``` 檢查函數的第 `arg` 個參數是否是一個 字符串,并返回該字符串; 如果 `l` 不為 `NULL` , 將字符串的長度填入 `*l`。 這個函數使用 [`lua_tolstring`](#lua_tolstring) 來獲取結果。 所以該函數有可能引發的轉換都同樣有效。 ### `luaL_checknumber` [-0, +0, _v_] ``` lua_Number luaL_checknumber (lua_State *L, int arg); ``` 檢查函數的第 `arg` 個參數是否是一個 數字,并返回這個數字。 ### `luaL_checkoption` [-0, +0, _v_] ``` int luaL_checkoption (lua_State *L, int arg, const char *def, const char *const lst[]); ``` 檢查函數的第 `arg` 個參數是否是一個 字符串,并在數組 `lst` (比如是零結尾的字符串數組) 中查找這個字符串。 返回匹配到的字符串在數組中的索引號。 如果參數不是字符串,或是字符串在數組中匹配不到,都將拋出錯誤。 如果 `def` 不為 `NULL`, 函數就把 `def` 當作默認值。 默認值在參數 `arg` 不存在,或該參數是 **nil** 時生效。 這個函數通常用于將字符串映射為 C 枚舉量。 (在 Lua 庫中做這個轉換可以讓其使用字符串,而不是數字來做一些選項。) ### `luaL_checkstack` [-0, +0, _v_] ``` void luaL_checkstack (lua_State *L, int sz, const char *msg); ``` 將棧空間擴展到 `top + sz` 個元素。 如果擴展不了,則拋出一個錯誤。 `msg` 是用于錯誤消息的額外文本 (`NULL` 表示不需要額外文本)。 ### `luaL_checkstring` [-0, +0, _v_] ``` const char *luaL_checkstring (lua_State *L, int arg); ``` 檢查函數的第 `arg` 個參數是否是一個 字符串并返回這個字符串。 這個函數使用 [`lua_tolstring`](#lua_tolstring) 來獲取結果。 所以該函數有可能引發的轉換都同樣有效。 ### `luaL_checktype` [-0, +0, _v_] ``` void luaL_checktype (lua_State *L, int arg, int t); ``` 檢查函數的第 `arg` 個參數的類型是否是 `t`。 參見 [`lua_type`](#lua_type) 查閱類型 `t` 的編碼。 ### `luaL_checkudata` [-0, +0, _v_] ``` void *luaL_checkudata (lua_State *L, int arg, const char *tname); ``` 檢查函數的第 `arg` 個參數是否是一個類型為 `tname` 的用戶數據 (參見 [`luaL_newmetatable`](#luaL_newmetatable) )。 它會返回該用戶數據的地址 (參見 [`lua_touserdata`](#lua_touserdata))。 ### `luaL_checkversion` [-0, +0, –] ``` void luaL_checkversion (lua_State *L); ``` 檢查調用它的內核是否是創建這個 Lua 狀態機的內核。 以及調用它的代碼是否使用了相同的 Lua 版本。 同時也檢查調用它的內核與創建該 Lua 狀態機的內核 是否使用了同一片地址空間。 ### `luaL_dofile` [-0, +?, _e_] ``` int luaL_dofile (lua_State *L, const char *filename); ``` 加載并運行指定的文件。 它是用下列宏定義出來: ``` (luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0)) ``` 如果沒有錯誤,函數返回假; 有錯則返回真。 ### `luaL_dostring` [-0, +?, –] ``` int luaL_dostring (lua_State *L, const char *str); ``` 加載并運行指定的字符串。 它是用下列宏定義出來: ``` (luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0)) ``` 如果沒有錯誤,函數返回假; 有錯則返回真。 ### `luaL_error` [-0, +0, _v_] ``` int luaL_error (lua_State *L, const char *fmt, ...); ``` 拋出一個錯誤。 錯誤消息的格式由 `fmt` 給出。 后面需提供若干參數, 這些參數遵循 [`lua_pushfstring`](#lua_pushfstring) 中的規則。 如果能獲得相關信息,它還會在消息前面加上錯誤發生時的文件名及行號。 這個函數永遠不會返回。 但是在 C 函數中通常遵循慣用法: `return luaL_error(_args_)` 。 ### `luaL_execresult` [-0, +3, _e_] ``` int luaL_execresult (lua_State *L, int stat); ``` 這個函數用于生成標準庫中和進程相關函數的返回值。 (指 [`os.execute`](#pdf-os.execute) 和 [`io.close`](#pdf-io.close))。 ### `luaL_fileresult` [-0, +(1|3), _e_] ``` int luaL_fileresult (lua_State *L, int stat, const char *fname); ``` 這個函數用于生成標準庫中和文件相關的函數的返回值。 (指 ([`io.open`](#pdf-io.open), [`os.rename`](#pdf-os.rename), [`file:seek`](#pdf-file:seek),等。)。 ### `luaL_getmetafield` [-0, +(0|1), _e_] ``` int luaL_getmetafield (lua_State *L, int obj, const char *e); ``` 將索引 `obj` 處對象的元表中 `e` 域的值壓棧。 如果該對象沒有元表,或是該元表沒有相關域, 此函數什么也不會壓棧并返回 `LUA_TNIL`。 ### `luaL_getmetatable` [-0, +1, –] ``` int luaL_getmetatable (lua_State *L, const char *tname); ``` 將注冊表中 `tname` 對應的元表 (參見 [`luaL_newmetatable`](#luaL_newmetatable))壓棧。 如果沒有 `tname` 對應的元表,則將 **nil** 壓棧并返回假。 ### `luaL_getsubtable` [-0, +1, _e_] ``` int luaL_getsubtable (lua_State *L, int idx, const char *fname); ``` 確保 `t[fname]` 是一張表,并將這張表壓棧。 這里的 `t` 指索引 `idx` 處的值。 如果它原來就是一張表,返回真; 否則為它創建一張新表,返回假。 ### `luaL_gsub` [-0, +1, _e_] ``` const char *luaL_gsub (lua_State *L, const char *s, const char *p, const char *r); ``` 將字符串 `s` 生成一個副本, 并將其中的所有字符串 `p` 都替換為字符串 `r` 。 將結果串壓棧并返回它。 ### `luaL_len` [-0, +0, _e_] ``` lua_Integer luaL_len (lua_State *L, int index); ``` 以數字形式返回給定索引處值的“長度”; 它等價于在 Lua 中調用 '`#`' 的操作 (參見 [§3.4.7](#3.4.7))。 如果操作結果不是一個整數,則拋出一個錯誤。 (這種情況只發生在觸發元方法時。) ### `luaL_loadbuffer` [-0, +1, –] ``` int luaL_loadbuffer (lua_State *L, const char *buff, size_t sz, const char *name); ``` 等價于 [`luaL_loadbufferx`](#luaL_loadbufferx), 其 `mode` 參數等于 `NULL`。 ### `luaL_loadbufferx` [-0, +1, –] ``` int luaL_loadbufferx (lua_State *L, const char *buff, size_t sz, const char *name, const char *mode); ``` 把一段緩存加載為一個 Lua 代碼塊。 這個函數使用 [`lua_load`](#lua_load) 來加載 `buff` 指向的長度為 `sz` 的內存區。 這個函數和 [`lua_load`](#lua_load) 返回值相同。 `name` 作為代碼塊的名字,用于調試信息和錯誤消息。 `mode` 字符串的作用同函數 [`lua_load`](#lua_load)。 ### `luaL_loadfile` [-0, +1, _e_] ``` int luaL_loadfile (lua_State *L, const char *filename); ``` 等價于 [`luaL_loadfilex`](#luaL_loadfilex), 其 `mode` 參數等于 `NULL`。 ### `luaL_loadfilex` [-0, +1, _e_] ``` int luaL_loadfilex (lua_State *L, const char *filename, const char *mode); ``` 把一個文件加載為 Lua 代碼塊。 這個函數使用 [`lua_load`](#lua_load) 加載文件中的數據。 代碼塊的名字被命名為 `filename`。 如果 `filename` 為 `NULL`, 它從標準輸入加載。 如果文件的第一行以 `#` 打頭,則忽略這一行。 `mode` 字符串的作用同函數 [`lua_load`](#lua_load)。 此函數的返回值和 [`lua_load`](#lua_load) 相同, 不過它還可能產生一個叫做 `LUA_ERRFILE` 的出錯碼。這種錯誤發生于無法打開或讀入文件時,或是文件的模式錯誤。 和 [`lua_load`](#lua_load) 一樣,這個函數僅加載代碼塊不運行。 ### `luaL_loadstring` [-0, +1, –] ``` int luaL_loadstring (lua_State *L, const char *s); ``` 將一個字符串加載為 Lua 代碼塊。 這個函數使用 [`lua_load`](#lua_load) 加載一個零結尾的字符串 `s`。 此函數的返回值和 [`lua_load`](#lua_load) 相同。 也和 [`lua_load`](#lua_load) 一樣,這個函數僅加載代碼塊不運行。 ### `luaL_newlib` [-0, +1, _e_] ``` void luaL_newlib (lua_State *L, const luaL_Reg l[]); ``` 創建一張新的表,并把列表 `l` 中的函數注冊進去。 它是用下列宏實現的: ``` (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) ``` 數組 `l` 必須是一個數組,而不能是一個指針。 ### `luaL_newlibtable` [-0, +1, _e_] ``` void luaL_newlibtable (lua_State *L, const luaL_Reg l[]); ``` 創建一張新的表,并預分配足夠保存下數組 `l` 內容的空間(但不填充)。 這是給 [`luaL_setfuncs`](#luaL_setfuncs) 一起用的 (參見 [`luaL_newlib`](#luaL_newlib))。 它以宏形式實現, 數組 `l` 必須是一個數組,而不能是一個指針。 ### `luaL_newmetatable` [-0, +1, _e_] ``` int luaL_newmetatable (lua_State *L, const char *tname); ``` 如果注冊表中已存在鍵 `tname`,返回 0 。 否則, 為用戶數據的元表創建一張新表。 向這張表加入 `__name = tname` 鍵值對, 并將 `[tname] = new table` 添加到注冊表中, 返回 1 。 (`__name`項可用于一些錯誤輸出函數。) 這兩種情況都會把最終的注冊表中關聯 `tname` 的值壓棧。 ### `luaL_newstate` [-0, +0, –] ``` lua_State *luaL_newstate (void); ``` 創建一個新的 Lua 狀態機。 它以一個基于標準 C 的 `realloc` 函數實現的內存分配器 調用 [`lua_newstate`](#lua_newstate) 。 并把可打印一些出錯信息到標準錯誤輸出的 panic 函數(參見 [§4.6](#4.6)) 設置好,用于處理致命錯誤。 返回新的狀態機。 如果內存分配失敗,則返回 `NULL` 。 ### `luaL_openlibs` [-0, +0, _e_] ``` void luaL_openlibs (lua_State *L); ``` 打開指定狀態機中的所有 Lua 標準庫。 ### `luaL_optinteger` [-0, +0, _v_] ``` lua_Integer luaL_optinteger (lua_State *L, int arg, lua_Integer d); ``` 如果函數的第 `arg` 個參數是一個 整數(或可以轉換為一個整數), 返回該整數。 若該參數不存在或是 **nil**, 返回 `d`。 除此之外的情況,拋出錯誤。 ### `luaL_optlstring` [-0, +0, _v_] ``` const char *luaL_optlstring (lua_State *L, int arg, const char *d, size_t *l); ``` 如果函數的第 `arg` 個參數是一個 字符串,返回該字符串。 若該參數不存在或是 **nil**, 返回 `d`。 除此之外的情況,拋出錯誤。 若 `l` 不為 `NULL`, 將結果的長度填入 `*l` 。 ### `luaL_optnumber` [-0, +0, _v_] ``` lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number d); ``` 如果函數的第 `arg` 個參數是一個 數字,返回該數字。 若該參數不存在或是 **nil**, 返回 `d`。 除此之外的情況,拋出錯誤。 ### `luaL_optstring` [-0, +0, _v_] ``` const char *luaL_optstring (lua_State *L, int arg, const char *d); ``` 如果函數的第 `arg` 個參數是一個 字符串,返回該字符串。 若該參數不存在或是 **nil**, 返回 `d`。 除此之外的情況,拋出錯誤。 ### `luaL_prepbuffer` [-?, +?, _e_] ``` char *luaL_prepbuffer (luaL_Buffer *B); ``` 等價于 [`luaL_prepbuffsize`](#luaL_prepbuffsize), 其預定義大小為 `LUAL_BUFFERSIZE`。 ### `luaL_prepbuffsize` [-?, +?, _e_] ``` char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz); ``` 返回一段大小為 `sz` 的空間地址。 你可以將字符串復制其中以加到緩存 `B` 內 (參見 [`luaL_Buffer`](#luaL_Buffer))。 將字符串復制其中后,你必須調用 [`luaL_addsize`](#luaL_addsize) 傳入字符串的大小,才會真正把它加入緩存。 ### `luaL_pushresult` [-?, +1, _e_] ``` void luaL_pushresult (luaL_Buffer *B); ``` 結束對緩存 `B` 的使用,將最終的字符串留在棧頂。 ### `luaL_pushresultsize` [-?, +1, _e_] ``` void luaL_pushresultsize (luaL_Buffer *B, size_t sz); ``` 等價于 [`luaL_addsize`](#luaL_addsize),[`luaL_pushresult`](#luaL_pushresult)。 ### `luaL_ref` [-1, +0, _e_] ``` int luaL_ref (lua_State *L, int t); ``` 針對棧頂的對象,創建并返回一個在索引 `t` 指向的表中的 _引用_ (最后會彈出棧頂對象)。 此引用是一個唯一的整數鍵。 只要你不向表 `t` 手工添加整數鍵, [`luaL_ref`](#luaL_ref) 可以保證它返回的鍵的唯一性。 你可以通過調用 `lua_rawgeti(L, t, r)` 來找回由 `r` 引用的對象。 函數 [`luaL_unref`](#luaL_unref) 用來釋放一個引用關聯的對象 如果棧頂的對象是 **nil**, [`luaL_ref`](#luaL_ref) 將返回常量 `LUA_REFNIL`。 常量 `LUA_NOREF` 可以保證和 [`luaL_ref`](#luaL_ref) 能返回的其它引用值不同。 ### `luaL_Reg` ``` typedef struct luaL_Reg { const char *name; lua_CFunction func; } luaL_Reg; ``` 用于 [`luaL_setfuncs`](#luaL_setfuncs) 注冊函數的數組類型。 `name` 指函數名,`func` 是函數指針。 任何 [`luaL_Reg`](#luaL_Reg) 數組必須以一對 `name` 與 `func` 皆為 `NULL` 結束。 ### `luaL_requiref` [-0, +1, _e_] ``` void luaL_requiref (lua_State *L, const char *modname, lua_CFunction openf, int glb); ``` 如果 `modname` 不在 [`package.loaded`](#pdf-package.loaded) 中, 則調用函數 `openf` ,并傳入字符串 `modname`。 將其返回值置入 `package.loaded[modname]`。 這個行為好似該函數通過 [`require`](#pdf-require) 調用過一樣。 如果 `glb` 為真, 同時也講模塊設到全局變量 `modname` 里。 在棧上留下該模塊的副本。 ### `luaL_setfuncs` [-nup, +0, _e_] ``` void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup); ``` 把數組 `l` 中的所有函數 (參見 [`luaL_Reg`](#luaL_Reg)) 注冊到棧頂的表中(該表在可選的上值之下,見下面的解說)。 若 `nup` 不為零, 所有的函數都共享 `nup` 個上值。 這些值必須在調用之前,壓在表之上。 這些值在注冊完畢后都會從棧彈出。 ### `luaL_setmetatable` [-0, +0, –] ``` void luaL_setmetatable (lua_State *L, const char *tname); ``` 將注冊表中 `tname` 關聯元表 (參見 [`luaL_newmetatable`](#luaL_newmetatable)) 設為棧頂對象的元表。 ### `luaL_Stream` ``` typedef struct luaL_Stream { FILE *f; lua_CFunction closef; } luaL_Stream; ``` 標準輸入輸出庫中用到的標準文件句柄結構。 文件句柄實現為一個完全用戶數據, 其元表被稱為 `LUA_FILEHANDLE` (`LUA_FILEHANDLE` 是一個代表真正元表的名字的宏)。 這張元表由標準輸入輸出庫(參見 [`luaL_newmetatable`](#luaL_newmetatable))創建。 用戶數據必須以結構 `luaL_Stream` 開頭; 此結構其后可以包含任何其它數據。 `f` 域指向一個 C 數據流 (如果它為 `NULL` 表示一個沒有創建好的句柄)。 `closef` 域指向一個在關閉或回收該流時需要調用的 Lua 函數。 該函數將收到一個參數,即文件句柄。 它需要返回 **true**(操作成功)或 **nil** 加錯誤消息(出錯的時候)。 一旦 Lua 調用過這個域,該域的值就會修改為 `NULL` 以提示這個句柄已經被關閉了。 ### `luaL_testudata` [-0, +0, _e_] ``` void *luaL_testudata (lua_State *L, int arg, const char *tname); ``` 此函數和 [`luaL_checkudata`](#luaL_checkudata) 類似。 但它在測試失敗時會返回 `NULL` 而不是拋出錯誤。 ### `luaL_tolstring` [-0, +1, _e_] ``` const char *luaL_tolstring (lua_State *L, int idx, size_t *len); ``` 將給定索引處的 Lua 值轉換為一個相應格式的 C 字符串。 結果串不僅會壓棧,還會由函數返回。 如果 `len` 不為 `NULL` , 它還把字符串長度設到 `*len` 中。 如果該值有一個帶 `"__tostring"` 域的元表, `luaL_tolstring` 會以該值為參數去調用對應的元方法, 并將其返回值作為結果。 ### `luaL_traceback` [-0, +1, _e_] ``` void luaL_traceback (lua_State *L, lua_State *L1, const char *msg, int level); ``` 將棧 `L1` 的棧回溯信息壓棧。 如果 `msg` 不為 `NULL` ,它會附加到棧回溯信息之前。 `level` 參數指明從第幾層開始做棧回溯。 ### `luaL_typename` [-0, +0, –] ``` const char *luaL_typename (lua_State *L, int index); ``` 返回給定索引處值的類型名。 ### `luaL_unref` [-0, +0, –] ``` void luaL_unref (lua_State *L, int t, int ref); ``` 釋放索引 `t` 處表的 `ref` 引用對象 (參見 [`luaL_ref`](#luaL_ref) )。 此條目會從表中移除以讓其引用的對象可被垃圾收集。 而引用 `ref` 也被回收再次使用。 如果 `ref` 為 [`LUA_NOREF`](#pdf-LUA_NOREF) 或 [`LUA_REFNIL`](#pdf-LUA_REFNIL), [`luaL_unref`](#luaL_unref) 什么也不做。 ### `luaL_where` [-0, +1, _e_] ``` void luaL_where (lua_State *L, int lvl); ``` 將一個用于表示 `lvl` 層棧的控制點位置的字符串壓棧。 這個字符串遵循下面的格式: ``` _chunkname_:_currentline_: ``` 0 層指當前正在運行的函數, 1 層指調用正在運行函數的函數, 依次類推。 這個函數用于構建錯誤消息的前綴。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看