亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

文字

標(biāo)準(zhǔn)的Lua庫(kù)提供了直接通過(guò)C API實(shí)現(xiàn)的有用功能。其中一些功能為語(yǔ)言提供基本服務(wù)(例如typegetmetatable); 其他人提供對(duì)“外部”服務(wù)(例如I / O)的訪問(wèn); 其他人可以在Lua本身實(shí)現(xiàn),但是非常有用或者具有關(guān)鍵性能要求,應(yīng)該在C中實(shí)現(xiàn)(例如table.sort)。

所有庫(kù)都通過(guò)官方C API實(shí)現(xiàn),并作為單獨(dú)的C模塊提供。目前,Lua有以下標(biāo)準(zhǔn)庫(kù):

  • 基礎(chǔ)庫(kù)(第6.1節(jié));

  • 協(xié)同程序庫(kù)(第6.2節(jié));

  • 包庫(kù)(第6.3節(jié));

  • 字符串操作(第6.4節(jié));

  • 基本的UTF-8支持(第6.5節(jié));

  • 表操作(第6.6節(jié));

  • 數(shù)學(xué)函數(shù)(§6.7)(sin,log等);

  • 輸入和輸出(第6.8節(jié));

  • 操作系統(tǒng)設(shè)施(§6.9);

  • 調(diào)試設(shè)施(第6.10節(jié))。

除基本庫(kù)和包庫(kù)之外,每個(gè)庫(kù)都將其所有功能作為全局表的字段或其對(duì)象的方法提供。

要訪問(wèn)這些庫(kù),C主機(jī)程序應(yīng)調(diào)用該luaL_openlibs函數(shù),該函數(shù)將打開(kāi)所有標(biāo)準(zhǔn)庫(kù)?;蛘?,主機(jī)程序可以通過(guò)luaL_requiref調(diào)用luaopen_base(對(duì)于基本庫(kù)),luaopen_package(對(duì)于包庫(kù)),luaopen_coroutine(對(duì)于協(xié)程庫(kù)),luaopen_string(對(duì)于字符串庫(kù)),luaopen_utf8(對(duì)于UTF8庫(kù)),luaopen_table(對(duì)于表庫(kù)), luaopen_math(用于數(shù)學(xué)庫(kù)),(luaopen_io對(duì)于I / O庫(kù)), luaopen_os(用于操作系統(tǒng)庫(kù)),和luaopen_debug(對(duì)于調(diào)試庫(kù))。這些函數(shù)在聲明中lualib.h。

6.1 – Basic Functions

基礎(chǔ)庫(kù)為L(zhǎng)ua提供核心功能。如果您不在應(yīng)用程序中包含此庫(kù),則應(yīng)仔細(xì)檢查是否需要為其某些設(shè)施提供實(shí)現(xiàn)。

assert (v [, message])

error如果其參數(shù)的v值為假(即,無(wú)錯(cuò)誤),則調(diào)用; 否則,返回它的所有參數(shù)。在出錯(cuò)的情況下,message是錯(cuò)誤對(duì)象; 當(dāng)缺席時(shí),它默認(rèn)為“ assertion failed!

collectgarbage ([opt [, arg]])

該函數(shù)是垃圾收集器的通用接口。它根據(jù)它的第一個(gè)參數(shù)執(zhí)行不同的功能opt

  • collect”:執(zhí)行完整的垃圾收集循環(huán)。這是默認(rèn)選項(xiàng)。

  • stop”:停止垃圾回收器的自動(dòng)執(zhí)行。收集器只有在顯式調(diào)用時(shí)才會(huì)運(yùn)行,直到調(diào)用才能重新啟動(dòng)。

  • restart”:重新啟動(dòng)垃圾回收器的自動(dòng)執(zhí)行。

  • count”:以千字節(jié)為單位返回Lua使用的總內(nèi)存。該值有一個(gè)小數(shù)部分,所以它乘以1024給出了Lua使用的確切字節(jié)數(shù)(溢出除外)。

  • step”:執(zhí)行垃圾收集步驟。步驟“大小”由...控制arg。使用零值時(shí),收集器將執(zhí)行一個(gè)基本(不可分)的步驟。對(duì)于非零值,收集器將執(zhí)行內(nèi)存數(shù)量(以千字節(jié)為單位)由Lua分配。如果步驟完成收集周期,則返回true。

  • setpause”:設(shè)置arg為收集器暫停的新值(見(jiàn)§2.5)。返回以前的暫停值。

  • setstepmul”:設(shè)置arg為收集器步驟乘數(shù)的新值(見(jiàn)§2.5)。返回步驟的前一個(gè)值。

  • isrunning”:返回一個(gè)布爾值,告訴收集器是否正在運(yùn)行(即未停止)。

dofile ([filename])

打開(kāi)指定的文件并以Lua塊的形式執(zhí)行其內(nèi)容。當(dāng)不帶參數(shù)調(diào)用時(shí),dofile執(zhí)行標(biāo)準(zhǔn)input(stdin)的內(nèi)容。返回塊返回的所有值。在發(fā)生錯(cuò)誤的情況下,將錯(cuò)誤dofile傳播給其調(diào)用者(即,dofile不以保護(hù)模式運(yùn)行)。

error (message [, level])

終止最后一個(gè)被調(diào)用的保護(hù)函數(shù),并返回message錯(cuò)誤對(duì)象。函數(shù)error永不返回。

通常,error如果消息是字符串,則在消息的開(kāi)頭添加有關(guān)錯(cuò)誤位置的一些信息。該level參數(shù)指定如何獲取錯(cuò)誤位置。對(duì)于級(jí)別1(默認(rèn)值),錯(cuò)誤位置是error調(diào)用函數(shù)的位置。級(jí)別2將錯(cuò)誤指向調(diào)用的函數(shù)error被調(diào)用的位置; 等等。通過(guò)級(jí)別0可避免在消息中添加錯(cuò)誤位置信息。

_G

一個(gè)保存全局環(huán)境的全局變量(不是函數(shù))(見(jiàn)§2.2)。Lua本身并不使用這個(gè)變量; 改變其價(jià)值不會(huì)影響任何環(huán)境,反之亦然。

getmetatable (object)

如果object沒(méi)有metatable,則返回nil。否則,如果對(duì)象的metatable有一個(gè)__metatable字段,則返回相關(guān)的值。否則,返回給定對(duì)象的metatable。

ipairs (t)

返回三個(gè)值(一個(gè)迭代函數(shù),表t和0),以便構(gòu)造

for i,v in ipairs(t) do body end

將迭代鍵值對(duì)(1,t[1]),(2,t[2]),...,直到第一個(gè)零值。

load (chunk [, chunkname [, mode [, env]]])

加載一個(gè)塊。

如果chunk是字符串,則塊是該字符串。如果chunk是一個(gè)函數(shù),load請(qǐng)重復(fù)調(diào)用它以獲取塊碎片。每次調(diào)用都chunk必須返回一個(gè)與先前結(jié)果連接的字符串。返回一個(gè)空字符串,或無(wú)值表示塊的結(jié)尾。

如果沒(méi)有語(yǔ)法錯(cuò)誤,則將編譯后的塊作為函數(shù)返回; 否則,返回nil加上錯(cuò)誤消息。

如果結(jié)果函數(shù)有價(jià)值,那么將第一個(gè)upvalue設(shè)置為值(env如果給出該參數(shù)),或設(shè)置為全局環(huán)境的值。其他upvalues初始化為零。(當(dāng)你加載一個(gè)主塊時(shí),結(jié)果函數(shù)總是只有一個(gè)正值,即_ENV變量(參見(jiàn)§2.2)。但是,當(dāng)你加載一個(gè)從函數(shù)創(chuàng)建的二進(jìn)制塊時(shí)(參見(jiàn)string.dump),結(jié)果函數(shù)可以有一個(gè)任意數(shù)字)所有upvalues是新鮮的,也就是說(shuō),他們不與任何其他功能共享。

chunkname用作錯(cuò)誤消息和調(diào)試信息塊的名稱(請(qǐng)參閱第4.9節(jié))。如果不存在,則默認(rèn)為chunk,如果chunk是字符串,則為默認(rèn)值,否則為“ =(load)”。

該字符串mode控制塊是否可以是文本或二進(jìn)制文件(即,預(yù)編譯的塊)。它可能是字符串“ b”(僅二進(jìn)制塊),“ t”(僅文本塊)或“ bt”(二進(jìn)制和文本)。默認(rèn)是“ bt”。

Lua不檢查二進(jìn)制塊的一致性。惡意制作的二進(jìn)制塊可能會(huì)導(dǎo)致解釋器崩潰。

loadfile ([filename [, mode [, env]]])

類似于load,但是從文件filename或標(biāo)準(zhǔn)輸入中獲取塊,如果沒(méi)有給出文件名。

next (table [, index])

允許程序遍歷表的所有字段。它的第一個(gè)參數(shù)是一個(gè)表,第二個(gè)參數(shù)是這個(gè)表中的一個(gè)索引。next返回表格的下一個(gè)索引及其相關(guān)的值。當(dāng)用nil作為第二個(gè)參數(shù)調(diào)用時(shí),next返回一個(gè)初始索引及其相關(guān)的值。當(dāng)用最后一個(gè)索引調(diào)用時(shí),或者在空表中調(diào)用nil時(shí),next返回nil。如果第二個(gè)參數(shù)不存在,那么它被解釋為零。特別是,您可以使用next(t)來(lái)檢查表是否為空。

沒(méi)有指定枚舉索引的順序,即使對(duì)于數(shù)字索引也是如此。(要按數(shù)字順序遍歷表,請(qǐng)使用數(shù)字表示。)

next如果在遍歷期間將任何值分配給表中不存在的字段,則其行為是未定義的。您可以修改現(xiàn)有的字段。特別是,您可以清除現(xiàn)有的字段。

pairs (t)

如果t有metamethod __pairs,則將其t作為參數(shù)進(jìn)行調(diào)用,并返回調(diào)用的前三個(gè)結(jié)果。

否則,返回三個(gè)值:next函數(shù),表t,以便構(gòu)建

for k,v in pairs(t) do body end

將遍歷表的所有鍵值對(duì)t。

請(qǐng)參閱函數(shù)next以了解在遍歷過(guò)程中修改表的注意事項(xiàng)。

pcall (f [, arg1, ···])

f使用保護(hù)模式中的給定參數(shù)調(diào)用函數(shù)。這意味著里面的任何錯(cuò)誤f都不會(huì)傳播; 相反,pcall捕獲錯(cuò)誤并返回狀態(tài)碼。它的第一個(gè)結(jié)果是狀態(tài)碼(一個(gè)布爾值),如果調(diào)用成功沒(méi)有錯(cuò)誤,則為true。在這種情況下,在pcall返回第一個(gè)結(jié)果后,還會(huì)返回來(lái)自呼叫的所有結(jié)果。如果出現(xiàn)任何錯(cuò)誤,則pcall返回false加錯(cuò)誤消息。

print (···)

接收任意數(shù)量的參數(shù)并將其值輸出到stdout,使用tostring函數(shù)將每個(gè)參數(shù)轉(zhuǎn)換為字符串。print不適用于格式化輸出,但僅用于顯示值的快速方式,例如用于調(diào)試。為了完全控制輸出,請(qǐng)使用string.formatio.write。

rawequal (v1, v2)

檢查是否v1等于v2,而不調(diào)用__eqmetamethod。返回一個(gè)布爾值。

rawget (table, index)

獲取真正的價(jià)值table[index],而不用調(diào)用__indexmetamethod。table必須是一張桌子; index可能是任何值。

rawlen (v)

返回對(duì)象的長(zhǎng)度,該對(duì)象v必須是表或字符串,而不調(diào)用元__len方法。返回一個(gè)整數(shù)。

rawset (table, index, value)

設(shè)置table[index]to 的實(shí)際值value,而不用調(diào)用__newindexmetamethod。table必須是表格,index不同于nil和NaN的value值以及任何Lua值。

這個(gè)函數(shù)返回table。

select (index, ···)

如果index是一個(gè)數(shù)字,則返回參數(shù)號(hào)后面的所有參數(shù)index; 從末尾開(kāi)始的負(fù)數(shù)索引(-1是最后一個(gè)參數(shù))。否則,index必須是字符串"#",并select返回它收到的額外參數(shù)的總數(shù)。

setmetatable (table, metatable)

設(shè)置給定表格的元數(shù)據(jù)。(要更改其他類型的從Lua代碼的元表,則必須使用調(diào)試庫(kù)(§6.10)。)如果metatable,刪除指定表的元表。如果原始metatable有一個(gè)__metatable字段,則會(huì)引發(fā)錯(cuò)誤。

這個(gè)函數(shù)返回table。

tonumber (e [, base])

當(dāng)用no調(diào)用時(shí)base,tonumber嘗試將其參數(shù)轉(zhuǎn)換為數(shù)字。如果參數(shù)已經(jīng)是可轉(zhuǎn)換為數(shù)字的數(shù)字或字符串,則tonumber返回該數(shù)字; 否則返回nil

根據(jù)Lua的詞匯約定(見(jiàn)§3.1),字符串的轉(zhuǎn)換可能導(dǎo)致整數(shù)或浮點(diǎn)數(shù)。(該字符串可能有前導(dǎo)和尾隨空格以及符號(hào)。)

當(dāng)用with調(diào)用時(shí)base,那么e必須是一個(gè)字符串,將其解釋為該基數(shù)中的整數(shù)。基數(shù)可以是2到36之間的任何整數(shù),包括2和36。在10以上的基數(shù)中,字母“ A'(大寫(xiě)或小寫(xiě))代表10,' B'代表11等等,其中' Z'代表35.如果字符串e在給定基數(shù)中不是有效數(shù)字,則函數(shù)返回。

tostring (v)

接收任何類型的值并將其轉(zhuǎn)換為可讀格式的字符串。(要完全控制數(shù)字如何轉(zhuǎn)換,請(qǐng)使用string.format。)

如果metatable v有一個(gè)__tostring字段,那么tostring使用vas參數(shù)調(diào)用相應(yīng)的值,并將調(diào)用的結(jié)果作為結(jié)果。

type (v)

返回唯一參數(shù)的類型,以字符串形式編碼。該函數(shù)的可能結(jié)果是“ nil”(一個(gè)字符串,而不是值nil),“ number”,“ string”,“ boolean”,“ table”,“ function”,“ thread”和“ userdata”。

_VERSION

一個(gè)全局變量(不是函數(shù)),它包含一個(gè)包含正在運(yùn)行的Lua版本的字符串。這個(gè)變量的當(dāng)前值是“ Lua 5.3”。

xpcall (f, msgh [, arg1, ···])

這個(gè)功能類似于pcall,除了它設(shè)置了一個(gè)新的消息處理程序msgh。

6.2 – Coroutine Manipulation

這個(gè)庫(kù)包含操作協(xié)程的操作,這些操作來(lái)自表格內(nèi)部coroutine。有關(guān)協(xié)程的一般描述,請(qǐng)參閱第2.6節(jié)。

coroutine.create (f)

創(chuàng)建一個(gè)新的協(xié)程,與身體f。f必須是一個(gè)功能。返回這個(gè)新的協(xié)程,它是一個(gè)帶有類型的對(duì)象"thread"。

coroutine.isyieldable ()

當(dāng)運(yùn)行的協(xié)程可以屈服時(shí)返回true。

如果運(yùn)行的協(xié)程不是主線程,并且它不在不可執(zhí)行的C函數(shù)內(nèi),則可運(yùn)行協(xié)程。

coroutine.resume (co [, val1, ···])

啟動(dòng)或繼續(xù)執(zhí)行協(xié)程co。你第一次恢復(fù)一個(gè)協(xié)程時(shí),它開(kāi)始運(yùn)行它的身體。值val1,...作為參數(shù)傳遞給正文函數(shù)。如果協(xié)程已經(jīng)產(chǎn)生,resume重新啟動(dòng)它; 值val1,...作為收益結(jié)果傳遞。

如果協(xié)程沒(méi)有任何錯(cuò)誤地運(yùn)行,則resume返回true加上傳遞給yield(當(dāng)協(xié)程產(chǎn)生時(shí))或者正文函數(shù)返回的任何值(當(dāng)協(xié)程終止時(shí))。如果有任何錯(cuò)誤,則resume返回錯(cuò)誤并附加錯(cuò)誤消息。

coroutine.running ()

當(dāng)運(yùn)行的協(xié)程是主協(xié)程時(shí),返回正在運(yùn)行的協(xié)程和布爾值。

coroutine.status (co)

返回協(xié)程的狀態(tài)co,作為字符串:"running",如果協(xié)程正在運(yùn)行(即它被調(diào)用status); "suspended",如果協(xié)程暫停了呼叫yield,或者尚未開(kāi)始運(yùn)行; "normal"如果協(xié)程是活動(dòng)的但不運(yùn)行(即它已經(jīng)恢復(fù)了另一個(gè)協(xié)程); 并且"dead"如果協(xié)程已經(jīng)完成了它的主體功能,或者它已經(jīng)停止了一個(gè)錯(cuò)誤。

coroutine.wrap (f)

創(chuàng)建一個(gè)新的協(xié)程,與身體f。f必須是一個(gè)功能。返回一個(gè)函數(shù),每次調(diào)用時(shí)都會(huì)恢復(fù)協(xié)程。任何傳遞給該函數(shù)的參數(shù)都會(huì)作為額外的參數(shù)resume。返回resume除第一個(gè)布爾值之外返回的相同值。在發(fā)生錯(cuò)誤的情況下,傳播錯(cuò)誤。

coroutine.yield (···)

暫停調(diào)用協(xié)程的執(zhí)行。任何參數(shù)yield作為額外結(jié)果傳遞給resume。

6.3 – Modules

包庫(kù)提供了用于在Lua中加載模塊的基本設(shè)施。它直接在全球環(huán)境中輸出一個(gè)函數(shù):require。其他的一切都以表格的形式輸出package

require (modname)

加載給定的模塊。該函數(shù)首先查看package.loaded表以確定是否modname已經(jīng)加載。如果是,則require返回存儲(chǔ)在的值package.loaded[modname]。否則,它會(huì)嘗試為模塊查找加載程序。

要找到一個(gè)裝載機(jī),requirepackage.searchers序列指導(dǎo)。通過(guò)改變這個(gè)順序,我們可以改變?nèi)绾?code>require查找模塊。以下說(shuō)明基于默認(rèn)配置package.searchers。

第一次require查詢package.preload[modname]。如果它有一個(gè)值,這個(gè)值(它必須是一個(gè)函數(shù))是加載器。否則require使用存儲(chǔ)在路徑中的路徑搜索Lua加載程序package.path。如果這也失敗了,它使用保存的路徑搜索一個(gè)C加載器package.cpath。如果這也失敗了,它會(huì)嘗試一個(gè)全功能的加載程序(請(qǐng)參閱參考資料package.searchers)。

一旦找到一個(gè)加載器,require就用兩個(gè)參數(shù)調(diào)用加載器:modname一個(gè)額外的值取決于它如何得到加載器。(如果加載程序來(lái)自文件,則此額外值為文件名。)如果加載程序返回任何非零值,require則將返回值指定給package.loaded[modname]。如果加載器沒(méi)有返回非零值并且沒(méi)有分配任何值package.loaded[modname],則將truerequire賦值給該條目。無(wú)論如何,返回最終值。requirepackage.loaded[modname]

如果在加載或運(yùn)行模塊時(shí)出現(xiàn)任何錯(cuò)誤,或者如果找不到該模塊的任何加載程序,則會(huì)require引發(fā)錯(cuò)誤。

package.config

描述包的一些編譯時(shí)配置的字符串。這個(gè)字符串是一系列的行:

  • 第一行是目錄分隔符字符串。\對(duì)于Windows,默認(rèn)值為' ',/對(duì)于其他所有系統(tǒng),默認(rèn)值為' ' 。

  • 第二行是分隔路徑中模板的字符。默認(rèn)是' ;'。

  • 第三行是標(biāo)記模板中替換點(diǎn)的字符串。默認(rèn)是' ?'。

  • 第四行是一個(gè)字符串,它在Windows的路徑中被可執(zhí)行文件的目錄替換。默認(rèn)是' !'。

  • 第五行是構(gòu)建luaopen_函數(shù)名稱時(shí)忽略所有文本的標(biāo)記。默認(rèn)是' -'。

package.cpath

require搜索C加載器所用的路徑。

Lua 使用環(huán)境變量或環(huán)境變量或者定義的缺省路徑,以與package.cpath初始化Lua路徑相同的方式初始化C路徑。package.pathLUA_CPATH_5_3LUA_CPATHluaconf.h

package.loaded

用于require控制哪些模塊已經(jīng)加載的表格。當(dāng)你需要一個(gè)模塊modname并且package.loaded[modname]不是假的,require只需返回存儲(chǔ)在那里的值。

這個(gè)變量只是對(duì)真實(shí)表的引用; 賦給這個(gè)變量不會(huì)改變使用的表require。

package.loadlib (libname, funcname)

將主機(jī)程序與C庫(kù)動(dòng)態(tài)鏈接libname。

如果funcname是“ *”,那么它只與庫(kù)鏈接,使庫(kù)導(dǎo)出的符號(hào)可用于其他動(dòng)態(tài)鏈接的庫(kù)。否則,它將funcname在庫(kù)中查找函數(shù),并將此函數(shù)作為C函數(shù)返回。所以,funcname必須遵循lua_CFunction原型(見(jiàn)lua_CFunction)。

這是一個(gè)低級(jí)功能。它完全繞過(guò)了封裝和模塊系統(tǒng)。不像require,它不執(zhí)行任何路徑搜索,也不會(huì)自動(dòng)添加擴(kuò)展。libname必須是C庫(kù)的完整文件名,包括必要時(shí)包含路徑和擴(kuò)展名。funcname必須是由C庫(kù)導(dǎo)出的確切名稱(可能取決于所使用的C編譯器和鏈接器)。

標(biāo)準(zhǔn)C不支持此功能。因此,它僅在某些平臺(tái)(Windows,Linux,Mac OS X,Solaris,BSD以及支持該dlfcn標(biāo)準(zhǔn)的其他Unix系統(tǒng))上可用。

package.path

require搜索Lua加載器所用的路徑。

在啟動(dòng)時(shí),如果沒(méi)有定義這些環(huán)境變量,Lua會(huì)使用環(huán)境變量LUA_PATH_5_3或環(huán)境變量的值LUA_PATH或定義的默認(rèn)路徑來(lái)初始化此變量luaconf.h。;;環(huán)境變量值中的任何“ ”被替換為默認(rèn)路徑。

package.preload

用于存儲(chǔ)特定模塊的加載程序的表(請(qǐng)參閱require)。

這個(gè)變量只是對(duì)真實(shí)表的引用; 賦給這個(gè)變量不會(huì)改變使用的表require。

package.searchers

用于require控制如何加載模塊的表格。

此表中的每個(gè)條目都是搜索器功能。當(dāng)查找一個(gè)模塊時(shí),require以升序方式調(diào)用每個(gè)搜索器,并將模塊名稱(給出的參數(shù)require)作為唯一參數(shù)。該函數(shù)可以返回另一個(gè)函數(shù)(模塊加載器)加上一個(gè)將被傳遞給該加載器的額外值,或者一個(gè)字符串來(lái)解釋為什么它找不到該模塊(或者如果沒(méi)有什么可說(shuō)的話,則為零)。

Lua用四個(gè)搜索函數(shù)初始化這個(gè)表。

第一個(gè)搜索者只是在package.preload表中尋找一個(gè)加載器。

第二個(gè)搜索器使用存儲(chǔ)在的路徑查找一個(gè)加載器作為L(zhǎng)ua庫(kù)package.path。搜索按功能描述完成package.searchpath。

第三個(gè)搜索器使用由變量給出的路徑將加載器查找為C庫(kù)package.cpath。再次,搜索按功能描述完成package.searchpath。例如,如果C路徑是字符串

"./?.so;./?.dll;/usr/local/?/init.so"

對(duì)于模塊搜索foo將嘗試打開(kāi)這些文件./foo.so./foo.dll以及/usr/local/foo/init.so以該順序。一旦找到一個(gè)C庫(kù),該搜索器首先使用動(dòng)態(tài)鏈接工具將應(yīng)用程序與庫(kù)鏈接起來(lái)。然后它試圖在庫(kù)中找到一個(gè)用作加載器的C函數(shù)。此C函數(shù)的名稱是字符串“ luaopen_”,與模塊名稱的副本連接,每個(gè)點(diǎn)用下劃線替換。此外,如果模塊名稱帶有連字符,則會(huì)刪除(并包括)第一個(gè)連字符后的后綴。例如,如果模塊名稱是a.b.c-v2.1,函數(shù)名稱將是luaopen_a_b_c。

第四個(gè)搜索者嘗試一個(gè)全功能的加載器。它在C路徑中搜索給定模塊的根名稱的庫(kù)。例如,當(dāng)需要時(shí)a.b.c,它會(huì)搜索一個(gè)C庫(kù)a。如果找到,它會(huì)查看子模塊的打開(kāi)功能; 在我們的例子中,那將是luaopen_a_b_c。有了這個(gè)功能,軟件包可以將幾個(gè)C子模塊打包到一個(gè)單獨(dú)的庫(kù)中,每個(gè)子模塊保持其原有的開(kāi)放功能。

除第一個(gè)搜索者(預(yù)加載)外,所有搜索者都會(huì)返回額外值作為返回的模塊的文件名package.searchpath。第一個(gè)搜索者沒(méi)有返回任何額外的值。

package.searchpath (name, path [, sep [, rep]])

搜索給定name的給定path。

路徑是包含由分號(hào)分隔的模板序列的字符串。對(duì)于每個(gè)模板,該函數(shù)將模板中的每個(gè)詢問(wèn)標(biāo)記(如果有)替換為副本,name其中sep默認(rèn)情況下所有出現(xiàn)的(缺省為點(diǎn))被rep(系統(tǒng)的目錄分隔符,默認(rèn)情況下)取代,然后嘗試打開(kāi)結(jié)果文件名。

例如,如果路徑是字符串

"./?.lua;./?.lc;/usr/local/?/init.lua"

對(duì)于名稱搜索foo.a將嘗試打開(kāi)這些文件./foo/a.lua,./foo/a.lc以及/usr/local/foo/a/init.lua以該順序。

返回可以在讀取模式下(關(guān)閉文件后)打開(kāi)的第一個(gè)文件的結(jié)果名稱,如果沒(méi)有成功,則返回nil加上錯(cuò)誤消息。(此錯(cuò)誤消息列出了它試圖打開(kāi)的所有文件名。)

6.4 – String Manipulation

這個(gè)庫(kù)提供了字符串操作的通用函數(shù),例如查找和提取子字符串以及模式匹配。在Lua中索引一個(gè)字符串時(shí),第一個(gè)字符位于位置1(不是0,如C)。索引被允許為負(fù)數(shù),并被解釋為從字符串的末尾向后索引。因此,最后一個(gè)字符位于-1,依此類推。

字符串庫(kù)在表內(nèi)提供了它的所有功能string。它還為__index字段指向表的字符串設(shè)置了metatable string。因此,您可以在面向?qū)ο蟮娘L(fēng)格中使用字符串函數(shù)。比如,string.byte(s,i)可以寫(xiě)成s:byte(i)

字符串庫(kù)采用單字節(jié)字符編碼。

string.byte (s [, i [, j]])

返回字符的內(nèi)部數(shù)字代碼s[i]s[i+1],... s[j]。默認(rèn)值為i1; jis 的默認(rèn)值i。這些指數(shù)按照相同的功能規(guī)則進(jìn)行修正string.sub

數(shù)字代碼不一定是跨平臺(tái)移植的。

string.char (···)

接收零個(gè)或多個(gè)整數(shù)。返回一個(gè)長(zhǎng)度等于參數(shù)個(gè)數(shù)的字符串,其中每個(gè)字符的內(nèi)部數(shù)字代碼等于其相應(yīng)的參數(shù)。

數(shù)字代碼不一定是跨平臺(tái)移植的。

string.dump (function [, strip])

返回包含給定函數(shù)的二進(jìn)制表示(二進(jìn)制塊)的load字符串,以便稍后在此字符串上返回該函數(shù)的副本(但具有新的upvalues)。如果strip是真值,則二進(jìn)制表示可能不包含有關(guān)該函數(shù)的所有調(diào)試信息,以節(jié)省空間。

具有upvalues的功能只有保存的upvalues的數(shù)量。當(dāng)(重新)加載時(shí),那些upvalues會(huì)收到包含nil的新實(shí)例。(您可以使用調(diào)試庫(kù)以適合您需要的方式序列化并重新載入函數(shù)的upvalues。)

string.find (s, pattern [, init [, plain]])

pattern查找字符串中的第一個(gè)匹配項(xiàng)(請(qǐng)參閱第6.4.1節(jié))s。如果找到匹配項(xiàng),則find返回s此事件開(kāi)始和結(jié)束位置的索引; 否則返回nil。第三個(gè)可選的數(shù)字參數(shù)init指定從何處開(kāi)始搜索; 其默認(rèn)值是1,可以是負(fù)數(shù)。作為第四個(gè)可選參數(shù)的trueplain會(huì)關(guān)閉模式匹配工具,因此該函數(shù)會(huì)執(zhí)行簡(jiǎn)單的“查找子字符串”操作,而不會(huì)將字符pattern視為魔術(shù)。請(qǐng)注意,如果plain給出,那么也init必須給出。

如果模式已經(jīng)捕獲,那么在成功的匹配中,捕獲的值也會(huì)在兩個(gè)索引之后返回。

string.format (formatstring, ···)

按照其第一個(gè)參數(shù)(必須是字符串)中給出的描述,返回其可變數(shù)量參數(shù)的格式化版本。格式字符串遵循與ISO C函數(shù)相同的規(guī)則sprintf。唯一的區(qū)別是選項(xiàng)/修飾符*,hL,ln,和p不支持,并且有一個(gè)額外的選項(xiàng),q。

q選項(xiàng)在雙引號(hào)之間格式化字符串,必要時(shí)使用轉(zhuǎn)義序列以確保它可以安全地由Lua解釋器讀回。例如,電話

string.format('%q', 'a string with "quotes" and \n new line')

可能會(huì)產(chǎn)生字符串:

"a string with \"quotes\" and \
 new line"

選項(xiàng)A,aE,e,f,G,和g所有期望一個(gè)數(shù)字作為論據(jù)。選項(xiàng)c,d,i,o,u,X,并x期待一個(gè)整數(shù)。當(dāng)使用C89編譯器編譯Lua時(shí),選項(xiàng)Aa(十六進(jìn)制浮點(diǎn)數(shù))不支持任何修飾符(標(biāo)志,寬度,長(zhǎng)度)。

選項(xiàng)s需要一個(gè)字符串; 如果它的參數(shù)不是一個(gè)字符串,它將被轉(zhuǎn)換為一個(gè)遵循相同的規(guī)則tostring。如果該選項(xiàng)具有任何修飾符(標(biāo)志,寬度,長(zhǎng)度),則字符串參數(shù)不應(yīng)包含嵌入的零。

string.gmatch (s, pattern)

返回一個(gè)迭代器函數(shù),每次調(diào)用它時(shí),都會(huì)從pattern字符串中返回下一個(gè)捕獲(請(qǐng)參閱第6.4.1節(jié))s。如果pattern沒(méi)有指定捕捉,那么整個(gè)比賽都是在每個(gè)呼叫中產(chǎn)生的。

作為一個(gè)例子,下面的循環(huán)將遍歷字符串中的所有單詞s,每行打印一個(gè)單詞:

s = "hello world from Lua"for w in string.gmatch(s, "%a+") do  print(w)end

下一個(gè)示例key=value將給定字符串中的所有對(duì)收集到一個(gè)表中:

t = {}s = "from=world, to=Lua"for k, v in string.gmatch(s, "(%w+)=(%w+)") do
  t[k] = v
end

對(duì)于這個(gè)函數(shù),^模式開(kāi)頭的脫字符“ 不起作用”,因?yàn)檫@會(huì)阻止迭代。

string.gsub (s, pattern, repl [, n])

返回一個(gè)副本,s其中(見(jiàn)第6.4.1節(jié))的所有(或第一個(gè)n,如果給出)事件pattern已被替換字符串替換,該字符串repl可以是字符串,表格或函數(shù)。gsub作為其第二個(gè)值還返回發(fā)生的匹配總數(shù)。這個(gè)名字gsub來(lái)自全球性的Substitution

如果repl是字符串,則其值用于替換。該字符%用作轉(zhuǎn)義字符:repl形式中的任何序列%d,其中d在1和9之間,代表第d個(gè)捕獲子字符串的值。序列%0代表整個(gè)比賽。序列%%代表一個(gè)單一的%。

如果repl是表格,則對(duì)每一個(gè)匹配查詢表格,使用第一個(gè)捕捉作為關(guān)鍵字。

如果repl是一個(gè)函數(shù),那么每次匹配時(shí)都會(huì)調(diào)用該函數(shù),所有捕獲的子字符串按順序作為參數(shù)傳遞。

無(wú)論如何,如果該模式?jīng)]有指定捕獲,那么它的行為就好像整個(gè)模式在捕獲中一樣。

如果表查詢或函數(shù)調(diào)用返回的值是字符串或數(shù)字,則將其用作替換字符串; 否則,如果它是無(wú),則沒(méi)有替換(即,原始匹配保留在字符串中)。

這里有些例子:

x = string.gsub("hello world", "(%w+)", "%1 %1")--> x="hello hello world world"x = string.gsub("hello world", "%w+", "%0 %0", 1)--> x="hello hello world"x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")--> x="world hello Lua from"x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)--> x="home = /home/roberto, user = roberto"x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)      return load(s)()
    end)--> x="4+5 = 9"local t = {name="lua", version="5.3"}x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)--> x="lua-5.3.tar.gz"

string.len (s)

接收一個(gè)字符串并返回其長(zhǎng)度??兆址?code>""長(zhǎng)度為0.嵌入的零計(jì)數(shù),"a\000bc\000"長(zhǎng)度為5。

string.lower (s)

接收一個(gè)字符串并返回該字符串的一個(gè)副本,并將所有大寫(xiě)字母改為小寫(xiě)。所有其他角色保持不變。大寫(xiě)字母的定義取決于當(dāng)前的語(yǔ)言環(huán)境。

string.match (s, pattern [, init])

查找字符串中的第一個(gè)匹配項(xiàng)pattern(請(qǐng)參閱第6.4.1節(jié))s。如果它找到一個(gè),然后match從模式中返回捕獲; 否則返回。如果pattern指定不捕獲,則返回整個(gè)匹配。第三個(gè)可選的數(shù)字參數(shù)init指定從何處開(kāi)始搜索; 其默認(rèn)值是1,可以是負(fù)數(shù)。

string.pack (fmt, v1, v2, ···)

返回包含的值的二進(jìn)制串v1v2等堆積(即,在二進(jìn)制形式串行化)根據(jù)格式字符串fmt(參見(jiàn)§6.4.2)。

string.packsize (fmt)

返回string.pack給定格式的字符串的大小。格式字符串不能有可變長(zhǎng)度選項(xiàng)' s'或' z'(見(jiàn)§6.4.2)。

string.rep (s, n [, sep])

返回一個(gè)字符串,它是n由字符串s分隔的字符串副本的串聯(lián)sep。默認(rèn)值sep是空字符串(即沒(méi)有分隔符)。如果n不是正值,則返回空字符串。

(請(qǐng)注意,通過(guò)一次調(diào)用此功能就可以很容易地消耗機(jī)器的內(nèi)存。)

string.reverse (s)

返回一個(gè)字符串,該字符串是字符串s反轉(zhuǎn)

string.sub (s, i [, j])

返回該字符串的子字符串,s并從此處i繼續(xù)j; ij可能是負(fù)面的。如果j不存在,則假定它等于-1(這與字符串長(zhǎng)度相同)。特別是,該調(diào)用string.sub(s,1,j)返回s長(zhǎng)度的前綴j,string.sub(s, -i)(對(duì)于正數(shù)i)返回s長(zhǎng)度的后綴i。

如果在負(fù)指數(shù)轉(zhuǎn)換后i小于1,則校正為1.如果j大于字符串長(zhǎng)度,則校正為該長(zhǎng)度。如果,這些修正后,i大于j,該函數(shù)返回空字符串。

string.unpack (fmt, s [, pos])

根據(jù)格式字符串返回按字符串打包的值s(請(qǐng)參閱第6.4.2節(jié))??蛇x標(biāo)記從哪里開(kāi)始閱讀(默認(rèn)為1)。在讀取值之后,該函數(shù)還返回第一個(gè)未讀字節(jié)的索引。string.packfmtposss

string.upper (s)

接收一個(gè)字符串并返回此字符串的一個(gè)副本,并將所有小寫(xiě)字母更改為大寫(xiě)。所有其他角色保持不變。小寫(xiě)字母的定義取決于當(dāng)前的語(yǔ)言環(huán)境。

6.4.1 – Patterns

在Lua圖案通過(guò)定期串,其通過(guò)模式匹配功能解釋為圖案描述string.findstring.gmatch,string.gsub,和string.match。本節(jié)介紹這些字符串的語(yǔ)法和含義(即它們匹配的內(nèi)容)。

Character Class:

字符類用于表示一組字符。描述字符類時(shí)允許使用以下組合:

  • x:(   其中 x不是魔法字符之一 ^$()%.[]*+-?)表示字符 x本身。

  • .:(點(diǎn))表示所有字符。

  • %a:代表所有字母。

  • %c:表示所有控制字符。

  • %d:代表所有數(shù)字。

  • %g:表示除空格外的所有可打印字符。

  • %l:表示全部小寫(xiě)字母。

  • %p:代表所有標(biāo)點(diǎn)符號(hào)。

  • %s:代表所有空格字符。

  • %u:代表全部大寫(xiě)字母。

  • %w:表示所有字母數(shù)字字符。

  • %x:表示所有十六進(jìn)制數(shù)字。

  • %x:(其中x是任何非字母數(shù)字字符)表示字符x。這是擺脫魔法角色的標(biāo)準(zhǔn)方式。任何非字母數(shù)字字符(包括所有標(biāo)點(diǎn)字符,甚至是非魔法字符)都可以在%用于在模式中表示自己之前加上一個(gè)' '。

  • [set]:表示集合中所有字符聯(lián)合的類。字符范圍可以通過(guò)將范圍的結(jié)束字符按升序分隔為“ -'來(lái)指定。上面描述的所有類%x也可以用作組中的組件集合中的所有其他字符表示自己。例如,[%w_](或[_%w])表示所有字母數(shù)字字符加上下劃線,[0-7]表示八進(jìn)制數(shù)字,并且[0-7%l%-]表示八進(jìn)制數(shù)字加小寫(xiě)字母加上'-'字符。您可以將一個(gè)方括號(hào)放入一個(gè)集合中,方法是將其定位為集合中的第一個(gè)字符。您可以通過(guò)將連字符定位為集合中的第一個(gè)或最后一個(gè)字符來(lái)在連字符中添加連字符。(您也可以在兩種情況下使用轉(zhuǎn)義。)范圍和類之間的交互沒(méi)有定義。因此,模式[%a-z][a-%%]沒(méi)有意義。

  • [^set]:表示集合的補(bǔ)碼,其中集合被解釋為如上。

對(duì)于以單個(gè)字母(%a%c等)表示的所有類,相應(yīng)的大寫(xiě)字母表示該類的補(bǔ)碼。例如,%S表示所有非空格字符。

字母,空格和其他字符組的定義取決于當(dāng)前的語(yǔ)言環(huán)境。特別是,班級(jí)[a-z]可能不等同于%l。

圖案項(xiàng)目:

一個(gè)模式項(xiàng)目可以

  • 單個(gè)字符類,它匹配類中的任何單個(gè)字符;

  • 一個(gè)單一的字符類,后面跟著' *',它匹配類中零個(gè)或多個(gè)字符的重復(fù)。這些重復(fù)項(xiàng)目將始終匹配最長(zhǎng)的序列;

  • 一個(gè)單個(gè)字符類,后跟“ +”,它匹配類中一個(gè)或多個(gè)字符的重復(fù)。這些重復(fù)項(xiàng)目將始終匹配最長(zhǎng)的序列;

  • 一個(gè)單一的字符類,后面跟著' -',它也匹配類中零個(gè)或多個(gè)字符的重復(fù)。與' *' 不同,這些重復(fù)項(xiàng)目將始終匹配最短的序列;

  • 一個(gè)單一的字符類,后跟' ?',匹配類中一個(gè)字符的零次或一次出現(xiàn)。如果可能,它始終匹配一個(gè)事件;

  • %n,n在1和9之間; 這樣的項(xiàng)目匹配一個(gè)子字符串等于第n個(gè)捕獲的字符串(見(jiàn)下文)。

  • %bxy,其中xy是兩個(gè)不同的字符; 這樣的項(xiàng)目相匹配,與開(kāi)頭的字符串X,結(jié)尾?,并且其中X?平衡的。這意味著,如果從左到右讀取字符串,則對(duì)x計(jì)算+1并對(duì)于y計(jì)算-1,結(jié)尾y是計(jì)數(shù)達(dá)到0 的第一個(gè)y。例如,該項(xiàng)匹配具有平衡圓括號(hào)的表達(dá)式。%b()

  • %f[set],一個(gè)前沿模式 ; 這樣的項(xiàng)目匹配任何位置上的空字符串,使得下一個(gè)字符屬于set,并且前一個(gè)字符不屬于set。如前所述解釋集合集合。主題的開(kāi)始和結(jié)束被處理,就好像它們是字符' \0'。

模式:

圖案是圖案項(xiàng)的序列。^在模式開(kāi)頭的一個(gè)插入符“ '將匹配錨定在主題字符串的開(kāi)頭。$模式末尾的'' '將主題字符串末尾的匹配錨定。在其他職位上,' ^'和' $'沒(méi)有特殊的含義并代表自己。

捕獲:

一個(gè)模式可以包含括在括號(hào)內(nèi)的子模式; 他們描述捕獲。匹配成功時(shí),匹配捕獲的主題字符串的子字符串將被存儲(chǔ)(捕獲)以備將來(lái)使用。捕捉按照左括號(hào)進(jìn)行編號(hào)。例如,在該模式中"(a*(.)%w(%s*))",字符串匹配的部分"a*(.)%w(%s*)"被存儲(chǔ)為第一次捕獲(因此具有數(shù)字1); .用數(shù)字2捕獲字符匹配“ ”,并且匹配“ %s*” 的部分具有數(shù)字3。

作為一種特殊情況,空的捕獲()捕獲當(dāng)前的字符串位置(一個(gè)數(shù)字)。例如,如果我們將該模式"()aa()"應(yīng)用于字符串"flaaap",則會(huì)有兩個(gè)捕獲:3和5。

6.4.2 – Format Strings for Pack and Unpack

第一個(gè)參數(shù)是string.pack,,string.packsize并且string.unpack是格式字符串,它描述正在創(chuàng)建或讀取的結(jié)構(gòu)的布局。

格式字符串是一系列轉(zhuǎn)換選項(xiàng)。轉(zhuǎn)換選項(xiàng)如下所示:

  • <:設(shè)置小端

  • >:設(shè)置大端

  • =:設(shè)置本地排序

  • ![n]:將最大對(duì)齊設(shè)置為n(默認(rèn)為本地對(duì)齊)

  • b:有符號(hào)字節(jié)(char

  • B:一個(gè)無(wú)符號(hào)字節(jié)(char

  • h:簽名short(本地大?。?/p>

  • H:無(wú)符號(hào)short(原生大小)

  • l:簽名long(本地大?。?/p>

  • L:無(wú)符號(hào)long(原生大小)

  • j: 一個(gè) lua_Integer

  • J: 一個(gè) lua_Unsigned

  • T:a size_t(原生尺寸)

  • i[n]intn字節(jié)簽名(默認(rèn)是原生大?。?/p>

  • I[n]intn字節(jié)無(wú)符號(hào)(默認(rèn)為本地大小)

  • f:a float(原生尺寸)

  • d:a double(原生尺寸)

  • n: 一個(gè) lua_Number

  • cn:帶n字節(jié)的固定大小的字符串

  • z:以零結(jié)尾的字符串

  • s[n]:一個(gè)字符串前面的長(zhǎng)度編碼為帶n字節(jié)的無(wú)符號(hào)整數(shù)(默認(rèn)值為a size_t

  • x:一個(gè)字節(jié)的填充

  • Xop:根據(jù)選項(xiàng)排列的空項(xiàng)目op(否則將忽略)

  • '':(空格)被忽略

(A“ ”表示可選的整數(shù)。)除填充,空格和配置(選項(xiàng)“ ”)外,每個(gè)選項(xiàng)對(duì)應(yīng)于參數(shù)(in )或結(jié)果(in )。[n]xX <=>!string.packstring.unpack

對(duì)于選項(xiàng)“ !n”,“ sn”,“ in”和“ In”,n可以是1到16之間的任何整數(shù)。所有積分選項(xiàng)檢查溢出; string.pack檢查給定的值是否符合給定的大小; string.unpack檢查讀取值是否適合Lua整數(shù)。

任何格式字符串的起始位置都是前綴為“ !1=”,即最大對(duì)齊為1(無(wú)對(duì)齊)和本機(jī)排序。

對(duì)齊方式的工作方式如下:對(duì)于每個(gè)選項(xiàng),格式會(huì)獲得額外的填充,直到數(shù)據(jù)以選項(xiàng)大小和最大對(duì)齊之間的最小值的倍數(shù)的偏移量開(kāi)始; 這個(gè)最小值必須是2的冪。選項(xiàng)“ c”和“ z”不對(duì)齊; 選項(xiàng)“ s”遵循其開(kāi)始整數(shù)的對(duì)齊方式。

所有填充由零填充string.pack(并被忽略string.unpack)。

6.5 – UTF-8 Support

該庫(kù)為UTF-8編碼提供基本支持。它提供了表格內(nèi)的所有功能utf8。除了處理編碼之外,該庫(kù)不提供對(duì)Unicode的任何支持。任何需要字符含義的操作,如字符分類,都不在其范圍之內(nèi)。

除非另有說(shuō)明,否則將字節(jié)位置作為參數(shù)的所有函數(shù)都假定給定的位置是字節(jié)序列的開(kāi)始或加上主題字符串的長(zhǎng)度。就像在字符串庫(kù)中一樣,從字符串末尾開(kāi)始計(jì)算負(fù)指數(shù)。

utf8.char (···)

接收零個(gè)或多個(gè)整數(shù),將每個(gè)整數(shù)轉(zhuǎn)換為其對(duì)應(yīng)的UTF-8字節(jié)序列,并返回一個(gè)串聯(lián)所有這些序列的字符串。

utf8.charpattern

模式(一個(gè)字符串,不是函數(shù))“ [\0-\x7F\xC2-\xF4][\x80-\xBF]*”(見(jiàn)§6.4.1),它恰好匹配一個(gè)UTF-8字節(jié)序列,假設(shè)主體是一個(gè)有效的UTF-8字符串。

utf8.codes (s)

返回值以便構(gòu)造

for p, c in utf8.codes(s) do body end

將迭代字符串中的所有字符s,其中p包括c每個(gè)字符的位置(以字節(jié)為單位)和代碼點(diǎn)。如果它遇到任何無(wú)效的字節(jié)序列,則會(huì)引發(fā)錯(cuò)誤。

utf8.codepoint (s [, i [, j]])

返回s字節(jié)位置ij(均包含)之間的所有字符中的代碼點(diǎn)(以整數(shù)形式)。缺省值i是1和ji。如果它遇到任何無(wú)效的字節(jié)序列,則會(huì)引發(fā)錯(cuò)誤。

utf8.len (s [, i [, j]])

返回s在位置ij(包括兩個(gè)端點(diǎn))之間開(kāi)始的字符串中UTF-8字符的數(shù)量。缺省值i是1,并且j是-1。如果發(fā)現(xiàn)任何無(wú)效的字節(jié)序列,則返回一個(gè)假值加上第一個(gè)無(wú)效字節(jié)的位置。

utf8.offset (s, n [, i])

返回(從位置開(kāi)始計(jì)數(shù))n第 - 個(gè)字符開(kāi)始編碼的位置(以字節(jié)為單位)。負(fù)數(shù)在位置前獲得字符。當(dāng)為非負(fù)時(shí)默認(rèn)為1 ,否則為從字符串末尾獲得第 - 個(gè)字符的偏移量。如果指定的字符既不在主題中,也不在主題結(jié)束后,該函數(shù)返回nil。siniin#s + 1utf8.offset(s, -n)n

作為特殊情況,當(dāng)n為0時(shí),函數(shù)返回包含第 - i個(gè)字節(jié)的字符的編碼開(kāi)始s。

這個(gè)函數(shù)假定這s是一個(gè)有效的UTF-8字符串。

6.6 – Table Manipulation

該庫(kù)為表格操作提供了通用函數(shù)。它提供了表格內(nèi)的所有功能table。

記住,每當(dāng)一個(gè)操作需要一個(gè)表的長(zhǎng)度時(shí),關(guān)于長(zhǎng)度運(yùn)算符的所有注意事項(xiàng)都適用(見(jiàn)§3.4.7)。所有函數(shù)都會(huì)忽略以參數(shù)形式給出的表中的非數(shù)字鍵。

table.concat (list [, sep [, i [, j]]])

給定一個(gè)列表,其中所有元素都是字符串或數(shù)字,返回字符串list[i]..sep..list[i+1] ··· sep..list[j]。默認(rèn)值為sep空字符串,默認(rèn)i值為1,默認(rèn)j值為#list。如果i大于j,則返回空字符串。

table.insert (list, [pos,] value)

插入元件value在位置poslist,上移的元素list[pos], list[pos+1], ···, list[#list]。posis 的缺省值#list+1,以便在列表末尾table.insert(t,x)插入一個(gè)調(diào)用。xt

table.move (a1, f, e, t [,a2])

a1將表格中的元素移動(dòng)到表格a2,執(zhí)行與以下多重賦值相同的操作:a2[t],··· = a1[f],···,a1[e]。a2is 的默認(rèn)值是a1。目標(biāo)范圍可以與源范圍重疊。要移動(dòng)的元素?cái)?shù)量必須符合Lua整數(shù)。

返回目標(biāo)表a2。

table.pack (···)

返回一個(gè)新表格,其中所有參數(shù)存儲(chǔ)在鍵1,2等中,并帶有一個(gè)n帶有參數(shù)總數(shù)“ ” 的字段。請(qǐng)注意,結(jié)果表可能不是一個(gè)序列。

table.remove (list [, pos])

list位置處的元素中移除pos,返回已移除元素的值。當(dāng)pos是1和1之間的整數(shù)時(shí)#list,它將元素向下移動(dòng)list[pos+1], list[pos+2], ···, list[#list]并擦除元素list[#list]; pos當(dāng)#list為0時(shí),索引也可以為0,或者#list + 1; 在這些情況下,該功能會(huì)擦除該元素list[pos]。

posis 的默認(rèn)值#list,以便調(diào)用table.remove(l)刪除列表的最后一個(gè)元素l。

table.sort (list [, comp])

排序列出一個(gè)給定的順序元素,就地,從list[1]list[#list]。如果comp給出,那么它必須是一個(gè)接收兩個(gè)列表元素的函數(shù),并且當(dāng)?shù)谝粋€(gè)元素必須位于最后一個(gè)順序中的第二個(gè)元素之前時(shí)返回true(所以在排序后i < j隱含not comp(list[j],list[i]))。如果comp沒(méi)有給出,則使用標(biāo)準(zhǔn)的Lua運(yùn)算符<

請(qǐng)注意,comp函數(shù)必須在列表中的元素上定義嚴(yán)格的部分順序; 也就是說(shuō),它必須是不對(duì)稱和傳遞的。否則,無(wú)法進(jìn)行有效的排序。

排序算法不穩(wěn)定:按給定順序認(rèn)為相同的元素可能會(huì)根據(jù)排序而改變其相對(duì)位置。

table.unpack (list [, i [, j]])

返回給定列表中的元素。這個(gè)功能相當(dāng)于

return list[i], list[i+1], ···, list[j]

默認(rèn)情況下,i是1并且j#list。

6.7 – Mathematical Functions

這個(gè)庫(kù)提供了基本的數(shù)學(xué)函數(shù)。它提供了表格中的所有功能和常量math。帶注釋“ integer/float”的函數(shù)給出整數(shù)參數(shù)的整數(shù)結(jié)果,以及浮點(diǎn)(或混合)參數(shù)的浮點(diǎn)結(jié)果。舍入函數(shù)(math.ceil,,math.floormath.modf)在結(jié)果符合整數(shù)范圍時(shí)返回整數(shù),否則返回浮點(diǎn)數(shù)。

math.abs (x)

返回的絕對(duì)值x。(整數(shù)/浮點(diǎn))

math.acos (x)

返回x(弧度)的反余弦值。

math.asin (x)

返回x(弧度)的反正弦值。

math.atan (y [, x])

返回y/x(以弧度為單位)的反正切,但使用兩個(gè)參數(shù)的符號(hào)來(lái)查找結(jié)果的象限。(它也可以正確處理x為零的情況。)

默認(rèn)值為x1,以便該調(diào)用math.atan(y)返回的反正切值y

math.ceil (x)

返回大于或等于的最小整數(shù)值x。

math.cos (x)

返回余弦值x(假設(shè)為弧度)。

math.deg (x)

將角度x從弧度轉(zhuǎn)換為度數(shù)。

math.exp (x)

返回值ex(其中e是自然對(duì)數(shù)的底數(shù))。

math.floor (x)

返回小于或等于的最大積分值x。

math.fmod (x, y)

返回xby 的除法余數(shù),y將商向零進(jìn)行舍入。(整數(shù)/浮點(diǎn))

math.huge

浮點(diǎn)值HUGE_VAL,一個(gè)大于任何其他數(shù)值的值。

math.log (x [, base])

返回x給定基數(shù)的對(duì)數(shù)。默認(rèn)base值為e(使函數(shù)返回自然對(duì)數(shù)x)。

math.max (x, ···)

根據(jù)Lua運(yùn)算符,返回具有最大值的參數(shù)<。(整數(shù)/浮點(diǎn))

math.maxinteger

一個(gè)整數(shù),其最大值為整數(shù)。

math.min (x, ···)

根據(jù)Lua運(yùn)算符,返回具有最小值的參數(shù)<。(整數(shù)/浮點(diǎn))

math.mininteger

一個(gè)整數(shù)的最小值的整數(shù)。

math.modf (x)

返回的整數(shù)部分x和小數(shù)部分x。其第二個(gè)結(jié)果總是一個(gè)浮動(dòng)。

math.pi

π的值。

math.rad (x)

x度數(shù)轉(zhuǎn)換為弧度。

math.random ([m [, n]])

在沒(méi)有參數(shù)的情況下調(diào)用時(shí),返回一個(gè)在[0,1]范圍內(nèi)均勻分布的偽隨機(jī)浮點(diǎn)數(shù)。當(dāng)與兩個(gè)整數(shù)稱為mn,math.random返回與在范圍內(nèi)均勻分布的偽隨機(jī)整數(shù)M,N。(nm值不能是負(fù)數(shù),必須符合一個(gè)Lua整數(shù)。)該調(diào)用math.random(n)等價(jià)于math.random(1,n)。

該功能是由C提供的下層偽隨機(jī)生成器功能的接口。

math.randomseed (x)

設(shè)置x為偽隨機(jī)生成器的“種子”:相等的種子產(chǎn)生相同的數(shù)字序列。

math.sin (x)

返回x(假定為弧度)的正弦值。

math.sqrt (x)

返回的平方根x。(您也可以使用表達(dá)式x^0.5來(lái)計(jì)算此值。)

math.tan (x)

返回x(假定以弧度表示)的正切值。

math.tointeger (x)

如果該值x可轉(zhuǎn)換為整數(shù),則返回該整數(shù)。否則,返回。

math.type (x)

返回“ integer”if x是一個(gè)整數(shù),“ float”如果它是一個(gè)浮點(diǎn)數(shù),或者nil如果x不是一個(gè)數(shù)字。

math.ult (m, n)

返回一個(gè)布爾值,當(dāng)且僅當(dāng)整數(shù)真正m低于整數(shù)n,當(dāng)他們?yōu)闊o(wú)符號(hào)整數(shù)比較。

6.8 – Input and Output Facilities

I / O庫(kù)為文件操作提供了兩種不同的樣式。第一個(gè)使用隱式文件句柄; 即有設(shè)置默認(rèn)輸入文件和默認(rèn)輸出文件的操作,并且所有輸入/輸出操作都在這些默認(rèn)文件上。第二種風(fēng)格使用顯式文件句柄。

使用隱式文件句柄時(shí),所有操作都由表提供io。當(dāng)使用顯式文件句柄時(shí),操作io.open返回一個(gè)文件句柄,然后提供所有操作作為文件句柄的方法。

該表io還提供了由C它們的通常含義三個(gè)預(yù)定義的文件句柄:io.stdin,io.stdout,和io.stderr。I / O庫(kù)從不關(guān)閉這些文件。

除非另有說(shuō)明,否則所有I / O函數(shù)在失敗時(shí)都會(huì)返回nil(作為第二個(gè)結(jié)果加上一個(gè)錯(cuò)誤消息,并將第三個(gè)結(jié)果作為依賴于系統(tǒng)的錯(cuò)誤代碼),并且某些值與成功時(shí)的值不同。在非POSIX系統(tǒng)上,在發(fā)生錯(cuò)誤時(shí)計(jì)算錯(cuò)誤消息和錯(cuò)誤代碼可能不是線程安全的,因?yàn)樗鼈円蕾囉谌諧變量errno。

io.close ([file])

相當(dāng)于file:close()。沒(méi)有file,關(guān)閉默認(rèn)的輸出文件。

io.flush ()

相當(dāng)于io.output():flush()。

io.input ([file])

當(dāng)用文件名稱調(diào)用時(shí),它將打開(kāi)指定文件(以文本模式),并將其句柄設(shè)置為默認(rèn)輸入文件。當(dāng)用文件句柄調(diào)用時(shí),它只是將此文件句柄設(shè)置為默認(rèn)輸入文件。當(dāng)不帶參數(shù)調(diào)用時(shí),它返回當(dāng)前的默認(rèn)輸入文件。

如果出現(xiàn)錯(cuò)誤,該函數(shù)會(huì)引發(fā)錯(cuò)誤,而不是返回錯(cuò)誤代碼。

io.lines ([filename, ···])

以讀取模式打開(kāi)給定的文件名,并返回一個(gè)迭代器函數(shù),它可以像file:lines(···)打開(kāi)的文件一樣工作。當(dāng)?shù)骱瘮?shù)檢測(cè)到文件結(jié)束時(shí),它將不返回任何值(完成循環(huán))并自動(dòng)關(guān)閉文件。

通話io.lines()(沒(méi)有文件名)相當(dāng)于io.input():lines("*l"); 也就是說(shuō),它遍歷默認(rèn)輸入文件的行。在這種情況下,循環(huán)結(jié)束時(shí)它不會(huì)關(guān)閉文件。

如果出現(xiàn)錯(cuò)誤,該函數(shù)會(huì)引發(fā)錯(cuò)誤,而不是返回錯(cuò)誤代碼。

io.open (filename [, mode])

該函數(shù)以字符串中指定的模式打開(kāi)一個(gè)文件mode。如果成功,它會(huì)返回一個(gè)新的文件句柄。

mode字符串可以是下列任何一項(xiàng):

  • r”:讀取模式(默認(rèn));

  • w”:寫(xiě)入模式;

  • a”:追加模式;

  • r+”:更新模式,所有以前的數(shù)據(jù)被保留;

  • w+”:更新模式,所有先前的數(shù)據(jù)被擦除;

  • a+”:追加更新模式,保留以前的數(shù)據(jù),只允許在文件末尾寫(xiě)入。

mode字符串最后也可以有'' b',這在某些系統(tǒng)中需要以二進(jìn)制模式打開(kāi)文件。

io.output ([file])

io.input默認(rèn)輸出文件類似,但操作在默認(rèn)輸出文件上。

io.popen (prog [, mode])

此功能取決于系統(tǒng),并不適用于所有平臺(tái)。

prog以獨(dú)立進(jìn)程啟動(dòng)程序并返回一個(gè)文件句柄,您可以使用該句柄從此程序讀取數(shù)據(jù)(如果mode"r",則為默認(rèn)值)或?qū)?shù)據(jù)寫(xiě)入此程序(如果mode"w")。

io.read (···)

相當(dāng)于io.input():read(···)。

io.tmpfile ()

如果成功,則返回臨時(shí)文件的句柄。該文件以更新模式打開(kāi),并在程序結(jié)束時(shí)自動(dòng)刪除。

io.type (obj)

檢查是否obj是有效的文件句柄。返回字符串,"file"如果obj是打開(kāi)的文件句柄,"closed file"if obj是關(guān)閉的文件句柄,或者如果不是文件句柄,則返回nilobj。

io.write (···)

相當(dāng)于io.output():write(···)。

file:close ()

關(guān)閉file。請(qǐng)注意,文件在垃圾回收處理時(shí)會(huì)自動(dòng)關(guān)閉,但需要花費(fèi)無(wú)法預(yù)測(cè)的時(shí)間。

當(dāng)關(guān)閉使用創(chuàng)建的文件句柄時(shí)io.popenfile:close返回相同的返回值os.execute。

file:flush ()

保存任何寫(xiě)入的數(shù)據(jù)file。

file:lines (···)

返回一個(gè)迭代器函數(shù),每次調(diào)用時(shí)都會(huì)根據(jù)給定的格式讀取文件。如果沒(méi)有給出格式,則使用“ l”作為默認(rèn)值。作為一個(gè)例子,建設(shè)

for c in file:lines(1) do body end

將從當(dāng)前位置開(kāi)始迭代文件的所有字符。不像io.lines,這個(gè)函數(shù)在循環(huán)結(jié)束時(shí)不會(huì)關(guān)閉文件。

如果出現(xiàn)錯(cuò)誤,該函數(shù)會(huì)引發(fā)錯(cuò)誤,而不是返回錯(cuò)誤代碼。

file:read (···)

file根據(jù)給定的格式讀取文件,這些格式指定要讀取的內(nèi)容。對(duì)于每種格式,該函數(shù)都返回一個(gè)字符串或一個(gè)數(shù)字,并讀取字符; 如果無(wú)法讀取指定格式的數(shù)據(jù),則返回nil。(在后一種情況下,該函數(shù)不會(huì)讀取后續(xù)格式。)當(dāng)沒(méi)有格式時(shí),它使用讀取下一行的默認(rèn)格式(見(jiàn)下文)。

可用的格式是

  • n”:按照Lua的詞匯約定,讀取一個(gè)數(shù)字并將其作為浮點(diǎn)數(shù)或整數(shù)返回。(數(shù)字可能有前導(dǎo)空格和符號(hào)。)這種格式總是讀取最長(zhǎng)的輸入序列,該輸入序列是數(shù)字的有效前綴; 如果該前綴未形成有效數(shù)字(例如,空字符串,“ 0x”或“ 3.4e-”),則將其丟棄并且函數(shù)返回nil

  • a”:從當(dāng)前位置開(kāi)始讀取整個(gè)文件。在文件結(jié)尾處,它返回空字符串。

  • l”:讀取下一行跳過(guò)行尾,在文件結(jié)尾處返回。這是默認(rèn)格式。

  • L”:讀取保存行尾字符的下一行(如果存在),在文件結(jié)尾處返回nil。

  • number   讀取一個(gè)字節(jié)數(shù)最多的字符串,在文件結(jié)尾處返回 nil。如果number為零,則它什么都不讀,并返回一個(gè)空字符串,或者在文件結(jié)尾處為零。

格式“ l”和“ L”只能用于文本文件。

file:seek ([whence [, offset]])

設(shè)置并從文件開(kāi)始處測(cè)量文件位置到offset由字符串指定的基點(diǎn)加上的位置whence,如下所示:

  • set”:base是位置0(文件的開(kāi)頭);

  • cur”:基數(shù)是當(dāng)前位置;

  • end”:基地是文件的結(jié)尾;

在成功的情況下,seek返回最終的文件位置,從文件開(kāi)始以字節(jié)為單位測(cè)量。如果seek失敗,則返回nil,加上描述錯(cuò)誤的字符串。

whenceis 的默認(rèn)值為"cur",并且for offset為0.因此,調(diào)用file:seek()返回當(dāng)前文件位置,而不更改它; 該調(diào)用file:seek("set")將位置設(shè)置為文件的開(kāi)始位置(并返回0); 并且調(diào)用file:seek("end")將該位置設(shè)置為文件末尾,并返回其大小。

file:setvbuf (mode [, size])

設(shè)置輸出文件的緩沖模式。有三種可用模式:

  • no”:無(wú)緩沖; 任何輸出操作的結(jié)果都立即出現(xiàn)。

  • full”:完全緩沖; 輸出操作僅在緩沖區(qū)已滿或您明確flush指定文件時(shí)執(zhí)行(請(qǐng)參閱io.flush)。

  • line”:行緩沖; 輸出被緩沖直到輸出換行符或者從某些特殊文件(例如終端設(shè)備)輸入任何輸入。

對(duì)于最后兩種情況,請(qǐng)size指定緩沖區(qū)的大?。ㄒ宰止?jié)為單位)。默認(rèn)值是合適的大小。

file:write (···)

將其每個(gè)參數(shù)的值寫(xiě)入file。參數(shù)必須是字符串或數(shù)字。

如果成功,此函數(shù)返回file。否則返回nil加一個(gè)描述錯(cuò)誤的字符串。

6.9 – Operating System Facilities

這個(gè)庫(kù)是通過(guò)表來(lái)實(shí)現(xiàn)的os。

os.clock ()

返回程序使用的CPU時(shí)間量的近似值。

os.date ([format [, time]])

返回包含日期和時(shí)間的字符串或表格,并根據(jù)給定的字符串格式化format。

如果time參數(shù)存在,這是要格式化的時(shí)間(請(qǐng)參閱該os.time函數(shù)以獲取該值的說(shuō)明)。否則,date格式化當(dāng)前時(shí)間。

如果format以' !' 開(kāi)頭,則日期格式為協(xié)調(diào)世界時(shí)。在此可選字符后,如果format是字符串“ *t”,則date返回包含以下字段的表:year,month(1-12),day(1-31),hour(0-23),min(0-59),sec(0-61 ),wday(星期一,星期一,星期日,星期一,星期一,星期一,星期一,星期一yday,1-366)和isdst夏令時(shí)標(biāo)志布爾值。如果信息不可用,則最后一個(gè)字段可能不存在。

如果format不是“ *t”,則date將該日期作為字符串返回,按照與ISO C函數(shù)相同的規(guī)則格式化strftime。

在沒(méi)有參數(shù)的情況下調(diào)用時(shí),date返回依賴于主機(jī)系統(tǒng)和當(dāng)前語(yǔ)言環(huán)境的合理日期和時(shí)間表示。(更具體地說(shuō),os.date()相當(dāng)于os.date("%c")。)

在非POSIX系統(tǒng)上,由于它依賴于C函數(shù)gmtime和C函數(shù),此函數(shù)可能不是線程安全的localtime

os.difftime (t2, t1)

t1不時(shí)t2(以秒為單位)返回差值(其中時(shí)間是返回的值os.time)。在POSIX,Windows和其他一些系統(tǒng)中,這個(gè)值就是t2-t1。

os.execute ([command])

該功能等同于ISO C功能system。它傳遞command給操作系統(tǒng)shell執(zhí)行。如果命令成功終止,其第一個(gè)結(jié)果是true,否則為零。在第一個(gè)結(jié)果之后,函數(shù)返回一個(gè)字符串加上一個(gè)數(shù)字,如下所示:

  • exit”:命令正常終止; 以下數(shù)字是該命令的退出狀態(tài)。

  • signal”:命令被信號(hào)終止; 以下數(shù)字是終止命令的信號(hào)。

當(dāng)沒(méi)有調(diào)用時(shí)command,os.execute返回一個(gè)布爾值,如果shell可用,則返回true。

os.exit ([code [, close]])

調(diào)用 ISO C 函數(shù)exit來(lái)終止主機(jī)程序。如果code,返回的狀態(tài)是EXIT_SUCCESS; 如果codefalse,返回的狀態(tài)是EXIT_FAILURE; 如果code是一個(gè)數(shù)字,返回的狀態(tài)就是這個(gè)數(shù)字。作為默認(rèn)值code。

如果可選的第二個(gè)參數(shù)close為true,則在退出之前關(guān)閉Lua狀態(tài)。

os.getenv (varname)

返回流程環(huán)境變量的值,如果變量未定義varname,則返回nil。

os.remove (filename)

用給定名稱刪除文件(或POSIX系統(tǒng)上的空目錄)。如果此函數(shù)失敗,則返回nil,加上描述錯(cuò)誤和錯(cuò)誤代碼的字符串。否則,它返回true。

os.rename (oldname, newname)

重命名指定的文件或目錄oldname來(lái)newname。如果此函數(shù)失敗,則返回nil,加上描述錯(cuò)誤和錯(cuò)誤代碼的字符串。否則,它返回true。

os.setlocale (locale [, category])

設(shè)置程序的當(dāng)前區(qū)域設(shè)置。locale是一個(gè)指定語(yǔ)言環(huán)境的依賴于系統(tǒng)的字符串; category是可選的字符串描述改變哪一類:"all","collate","ctype","monetary","numeric",或"time"; 默認(rèn)類別是"all"。該函數(shù)返回新語(yǔ)言環(huán)境的名稱,或者如果請(qǐng)求無(wú)法兌現(xiàn),則返回nil

如果locale是空字符串,則將當(dāng)前語(yǔ)言環(huán)境設(shè)置為實(shí)現(xiàn)定義的本地語(yǔ)言環(huán)境。如果locale是字符串“ C”,則將當(dāng)前語(yǔ)言環(huán)境設(shè)置為標(biāo)準(zhǔn)C語(yǔ)言環(huán)境。

當(dāng)用nil作為第一個(gè)參數(shù)調(diào)用時(shí),此函數(shù)僅返回給定類別的當(dāng)前語(yǔ)言環(huán)境的名稱。

這個(gè)函數(shù)可能不是線程安全的,因?yàn)樗蕾囉贑函數(shù)setlocale

os.time ([table])

在不帶參數(shù)的情況下調(diào)用當(dāng)前時(shí)間,或者返回表示由給定表指定的本地日期和時(shí)間的時(shí)間。該表必須包含字段year,monthday,并且可能有字段hour(默認(rèn)值為12),min(默認(rèn)值為0),sec(默認(rèn)值為0)和isdst(默認(rèn)值為零)。其他字段被忽略。有關(guān)這些字段的說(shuō)明,請(qǐng)參閱該os.date功能。

這些字段中的值不需要在有效范圍內(nèi)。例如,如果sec是-10,則表示距其他字段指定的時(shí)間為-10秒; 如果hour是1000,則表示距其他字段指定的時(shí)間+1000小時(shí)。

返回的值是一個(gè)數(shù)字,其含義取決于您的系統(tǒng)。在POSIX,Windows和其他一些系統(tǒng)中,這個(gè)數(shù)字計(jì)算自某些給定開(kāi)始時(shí)間(“時(shí)代”)以來(lái)的秒數(shù)。在其它系統(tǒng)中,意思是未指定,并且通過(guò)返回的數(shù)字time只能用于作為參數(shù)os.dateos.difftime

os.tmpname ()

返回可用于臨時(shí)文件的具有文件名的字符串。該文件必須在使用前明確打開(kāi),并在不再需要時(shí)明確刪除。

在POSIX系統(tǒng)上,該功能還會(huì)創(chuàng)建一個(gè)具有該名稱的文件,以避免安全風(fēng)險(xiǎn)。(其他人可能會(huì)在獲取名稱和創(chuàng)建文件之間的時(shí)間內(nèi)以錯(cuò)誤的權(quán)限創(chuàng)建文件。)您仍然必須打開(kāi)文件才能使用該文件并將其刪除(即使您不使用它)。

如果可能,您可能更喜歡使用io.tmpfile,它會(huì)在程序結(jié)束時(shí)自動(dòng)刪除文件。

6.10 – The Debug Library

該庫(kù)為L(zhǎng)ua程序提供了調(diào)試接口(§4.9)的功能。使用這個(gè)庫(kù)時(shí)應(yīng)該小心。它的幾個(gè)函數(shù)違反了關(guān)于Lua代碼的基本假設(shè)(例如,函數(shù)本地的變量不能從外部訪問(wèn);用戶數(shù)據(jù)元表達(dá)式不能被Lua代碼改變; Lua程序不會(huì)崩潰),因此可能危及其他安全代碼。而且,這個(gè)庫(kù)中的一些功能可能會(huì)很慢。

debug表格中提供了該庫(kù)中的所有功能。所有在線程上運(yùn)行的函數(shù)都有一個(gè)可選的第一個(gè)參數(shù),它是要運(yùn)行的線程。默認(rèn)總是當(dāng)前線程。

debug.debug ()

與用戶進(jìn)入交互模式,運(yùn)行用戶輸入的每個(gè)字符串。使用簡(jiǎn)單的命令和其他調(diào)試工具,用戶可以檢查全局和局部變量,更改它們的值,評(píng)估表達(dá)式等等。只包含單詞的行cont結(jié)束此函數(shù),以便調(diào)用方繼續(xù)執(zhí)行。

請(qǐng)注意,用于命令的命令在debug.debug詞匯上不嵌套在任何函數(shù)中,因此不能直接訪問(wèn)局部變量。

debug.gethook ([thread])

返回線程的當(dāng)前鉤子設(shè)置,作為三個(gè)值:當(dāng)前鉤子函數(shù),當(dāng)前鉤子掩碼和當(dāng)前鉤子計(jì)數(shù)(由debug.sethook函數(shù)設(shè)置)。

debug.getinfo ([thread,] f [, what])

返回包含有關(guān)函數(shù)信息的表格。你可以直接給這個(gè)函數(shù),或者你可以給一個(gè)數(shù)字作為值f,這意味著f在給定線程的調(diào)用堆棧級(jí)別上運(yùn)行的函數(shù):0級(jí)是當(dāng)前函數(shù)(getinfo本身)。等級(jí)1是被調(diào)用的函數(shù)getinfo(除了不計(jì)入堆棧的尾調(diào)用外); 等等。如果f是大于活動(dòng)函數(shù)數(shù)的數(shù)字,則getinfo返回nil。

返回的表可以包含返回的所有字段lua_getinfo,字符串what描述填寫(xiě)哪些字段。缺省值what是獲取所有可用信息,有效行表除外。如果存在,則選項(xiàng)“ f'添加一個(gè)以func該函數(shù)本身命名的字段。如果存在,選項(xiàng)' L'添加一個(gè)以activelines有效行表命名的字段。

例如debug.getinfo(1,"n").name,如果可以找到合理的名稱,則該表達(dá)式返回當(dāng)前函數(shù)的名稱,并且該表達(dá)式debug.getinfo(print)返回一個(gè)包含關(guān)于該print函數(shù)的所有可用信息的表。

debug.getlocal ([thread,] f, local)

此函數(shù)返回本地變量的名稱和值,以及堆棧local級(jí)別的函數(shù)的索引f。該函數(shù)不僅訪問(wèn)顯式局部變量,還訪問(wèn)參數(shù),臨時(shí)對(duì)象等。

第一個(gè)參數(shù)或局部變量具有索引1,依此類推,按照它們?cè)诖a中聲明的順序,只計(jì)算在當(dāng)前函數(shù)范圍內(nèi)處于活動(dòng)狀態(tài)的變量。負(fù)指數(shù)是指可變參數(shù); -1是第一個(gè)可變參數(shù)。如果沒(méi)有給定索引的變量,則該函數(shù)返回nil,并在超出范圍的級(jí)別調(diào)用時(shí)引發(fā)錯(cuò)誤。(您可以打電話debug.getinfo查看該級(jí)別是否有效。)

以' ('(左圓括號(hào))開(kāi)頭的變量名稱表示沒(méi)有已知名稱的變量(內(nèi)部變量,如循環(huán)控制變量,以及塊保存而沒(méi)有調(diào)試信息的變量)。

該參數(shù)f也可以是一個(gè)函數(shù)。在這種情況下,getlocal只返回函數(shù)參數(shù)的名稱。

debug.getmetatable (value)

返回給定valuenil的metatable,如果它沒(méi)有metatable。

debug.getregistry ()

返回注冊(cè)表表(請(qǐng)參閱§4.5)。

debug.getupvalue (f, up)

該函數(shù)返回的名稱和的upvalue的索引值up的功能f。如果給定索引不存在上值,則函數(shù)返回nil。

以' ('(左括號(hào))開(kāi)頭的變量名表示沒(méi)有已知名稱的變量(保存了沒(méi)有調(diào)試信息的塊的變量)。

debug.getuservalue (u)

返回與之相關(guān)的Lua值u。如果u不是完整的用戶數(shù)據(jù),則返回nil

debug.sethook ([thread,] hook, mask [, count])

將給定的函數(shù)設(shè)置為鉤子。字符串mask和數(shù)字count描述何時(shí)調(diào)用鉤子。字符串掩碼可以具有以下字符的任意組合,并具有給定的含義:

  • ' c':每次Lua調(diào)用函數(shù)時(shí)都會(huì)調(diào)用該鉤子;

  • ' r':每次Lua從函數(shù)返回時(shí)都會(huì)調(diào)用鉤子;

  • ' l':每次Lua輸入一行新代碼時(shí)都會(huì)調(diào)用鉤子。

而且,與count零不同的是,鉤子在每個(gè)count指令之后也被調(diào)用。

在沒(méi)有參數(shù)的情況下調(diào)用時(shí),debug.sethook關(guān)閉鉤子。

當(dāng)鉤被調(diào)用時(shí),它的第一個(gè)參數(shù)是描述已經(jīng)觸發(fā)了呼叫事件的字符串:"call"(或"tail call""return","line""count"。對(duì)于線事件,掛鉤也會(huì)獲取新的線號(hào)作為其第二個(gè)參數(shù)。在一個(gè)鉤子里面,你可以調(diào)用getinfo2級(jí)來(lái)獲得關(guān)于運(yùn)行函數(shù)的更多信息(0級(jí)是getinfo函數(shù),1級(jí)是鉤子函數(shù))。

debug.setlocal ([thread,] level, local, value)

該函數(shù)將該值賦給value本地變量,并在堆棧local級(jí)別使用該函數(shù)的索引level。如果沒(méi)有給定索引的局部變量,則該函數(shù)返回nil,并在level超出范圍調(diào)用時(shí)引發(fā)錯(cuò)誤。(您可以調(diào)用getinfo以檢查該級(jí)別是否有效。)否則,它將返回本地變量的名稱。

請(qǐng)參閱debug.getlocal有關(guān)變量索引和名稱的更多信息。

debug.setmetatable (value, table)

給定value給定的元數(shù)據(jù)table(可以為零)。退貨value

debug.setupvalue (f, up, value)

該函數(shù)將該值valueup該函數(shù)的索引一起賦值f。如果給定索引不存在上值,則函數(shù)返回nil。否則,它返回upvalue的名稱。

debug.setuservalue (udata, value)

將給定設(shè)置為與給定value關(guān)聯(lián)的Lua值udataudata必須是完整的用戶數(shù)據(jù)。

Returns udata.

debug.traceback ([thread,] [message [, level]])

如果message存在但不是字符串也不是,則此函數(shù)將message不作處理返回。否則,它將返回一個(gè)帶有回調(diào)調(diào)用堆棧的字符串。可選message字符串被追加到回溯的開(kāi)頭。一個(gè)可選的level數(shù)字告訴在哪個(gè)級(jí)別開(kāi)始回溯(默認(rèn)是1,函數(shù)調(diào)用traceback)。

debug.upvalueid (f, n)

返回n從給定函數(shù)編號(hào)的upvalue的唯一標(biāo)識(shí)符(作為light userdata)。

這些唯一標(biāo)識(shí)符允許程序檢查不同的關(guān)閉是否共享upvalue。共享一個(gè)upvalue(也就是說(shuō),訪問(wèn)一個(gè)相同的外部局部變量)的Lua閉包將為這些upvalue索引返回相同的id。

debug.upvaluejoin (f1, n1, f2, n2)

使n1Lua閉包f1n2第 - 個(gè)最高值指Lua閉包的第 - 個(gè)最高值f2。

雖然Lua被設(shè)計(jì)為擴(kuò)展語(yǔ)言,但是它被嵌入到主機(jī)C程序中,但它也經(jīng)常用作獨(dú)立語(yǔ)言。Lua作為獨(dú)立語(yǔ)言的解釋器簡(jiǎn)單地稱為lua標(biāo)準(zhǔn)分發(fā)。獨(dú)立解釋器包含所有標(biāo)準(zhǔn)庫(kù),包括調(diào)試庫(kù)。它的用法是:

lua [options] [script [args]]

選項(xiàng)是:

  • -e stat:執(zhí)行字符串stat ;

  • -l mod:“需要” mod ;

  • -i:運(yùn)行腳本后進(jìn)入交互模式;

  • -v:打印版本信息;

  • -E:忽略環(huán)境變量;

  • --:停止處理選項(xiàng);

  • -stdin作為文件執(zhí)行并停止處理選項(xiàng)。

處理lua完選項(xiàng)后,運(yùn)行給定的腳本。當(dāng)不帶參數(shù)調(diào)用時(shí),lua其行為lua -v -i與標(biāo)準(zhǔn)輸入(stdin)是終端時(shí)相反,lua -否則。

在沒(méi)有選項(xiàng)-E的情況下調(diào)用時(shí),解釋器在運(yùn)行任何參數(shù)之前檢查環(huán)境變量LUA_INIT_5_3(或者LUA_INIT如果未定義版本名稱)。如果變量?jī)?nèi)容具有格式@filename,則lua執(zhí)行該文件。否則,lua執(zhí)行字符串本身。

當(dāng)用選項(xiàng)調(diào)用時(shí)-E,除了忽略之外LUA_INIT,Lua還會(huì)忽略和的值,LUA_PATHLUA_CPATH設(shè)置package.pathpackage.cpath定義默認(rèn)路徑的值luaconf.h。

所有選項(xiàng)都按順序處理,除了-i-E。例如,像一個(gè)調(diào)用

$ lua -e'a=1' -e 'print(a)' script.lua

將首先設(shè)置a為1,然后打印該值a,最后運(yùn)行script.lua沒(méi)有參數(shù)的文件。(這里$是shell提示符,您的提示可能會(huì)有所不同。)

在運(yùn)行任何代碼之前,lua收集名為的全局表中的所有命令行參數(shù)arg。腳本名稱轉(zhuǎn)到索引0,腳本名稱轉(zhuǎn)到索引1后的第一個(gè)參數(shù),依此類推。腳本名稱之前的任何參數(shù)(即解釋器名稱加上其選項(xiàng))都會(huì)轉(zhuǎn)到負(fù)數(shù)索引。例如,在通話中

$ lua -la b.lua t1 t2

表是這樣的:

arg = { [-2] = "lua", [-1] = "-la",        [0] = "b.lua",        [1] = "t1", [2] = "t2" }

如果調(diào)用中沒(méi)有腳本,則解釋器名稱將轉(zhuǎn)到索引0,然后是其他參數(shù)。例如,電話

$ lua -e "print(arg[1])"

將打印“ -e”。如果有一個(gè)腳本,腳本被調(diào)用參數(shù)arg[1],...,arg[#arg]。(和Lua中的所有塊一樣,該腳本被編譯為可變參數(shù)函數(shù)。)

在交互模式下,Lua重復(fù)提示并等待一條線。讀完一行后,Lua首先嘗試將該行解釋為表達(dá)式。如果成功,則打印其值。否則,它會(huì)將該行解釋為聲明。如果你寫(xiě)一個(gè)不完整的語(yǔ)句,解釋器通過(guò)發(fā)出不同的提示來(lái)等待它的完成。

如果全局變量_PROMPT包含一個(gè)字符串,則其值將用作提示。同樣,如果全局變量_PROMPT2包含一個(gè)字符串,則其值將用作輔助提示(在不完整的語(yǔ)句中發(fā)出)。

如果腳本中存在未受保護(hù)的錯(cuò)誤,解釋器會(huì)將錯(cuò)誤報(bào)告給標(biāo)準(zhǔn)錯(cuò)誤流。如果錯(cuò)誤對(duì)象不是一個(gè)字符串,但有一個(gè)metamethod __tostring,解釋器會(huì)調(diào)用這個(gè)metamethod來(lái)產(chǎn)生最終的消息。否則,解釋器會(huì)將錯(cuò)誤對(duì)象轉(zhuǎn)換為字符串并向其添加堆?;厮荨?/p>

當(dāng)正常結(jié)束時(shí),解釋者關(guān)閉其主要的Lua狀態(tài)(參見(jiàn)lua_close)。腳本可以通過(guò)調(diào)用os.exit終止來(lái)避免這一步。

為了允許在Unix系統(tǒng)中使用Lua作為腳本解釋器,獨(dú)立解釋器跳過(guò)塊開(kāi)始的塊的第一行#。因此,Lua腳本可以通過(guò)使用chmod +x#!形式變成可執(zhí)行程序,如

#!/usr/local/bin/lua

(當(dāng)然,你的機(jī)器上Lua解釋器的位置可能不同,如果你的機(jī)器lua是在你的機(jī)器上的PATH

#!/usr/bin/env lua

是一種更便攜的解決方案。)

這里我們列出了將程序從Lua 5.2移植到Lua 5.3時(shí)可能遇到的不兼容問(wèn)題。你可以通過(guò)用適當(dāng)?shù)倪x項(xiàng)編譯Lua來(lái)避免一些不兼容(見(jiàn)文件luaconf.h)。但是,所有這些兼容性選項(xiàng)將在未來(lái)取消。

Lua版本總是可以以不暗示程序中源代碼更改的方式更改C API,例如常量的數(shù)值或?qū)⒑瘮?shù)實(shí)現(xiàn)為宏。因此,你不應(yīng)該假設(shè)二進(jìn)制文件在不同的Lua版本之間是兼容的。使用新版本時(shí),總是重新編譯Lua API的客戶端。

同樣,Lua版本可以隨時(shí)更改預(yù)編譯塊的內(nèi)部表示; 預(yù)編譯的塊在不同的Lua版本之間不兼容。

官方發(fā)行版中的標(biāo)準(zhǔn)路徑可能會(huì)在版本之間發(fā)生變化。

8.1 – Changes in the Language

  • Lua 5.2和Lua 5.3的主要區(qū)別在于引入了數(shù)字的整數(shù)子類型。盡管這種改變不應(yīng)該影響“正?!钡挠?jì)算,但一些計(jì)算(主要是那些涉及某種溢出的計(jì)算)可以給出不同的結(jié)果。你可以通過(guò)強(qiáng)制一個(gè)數(shù)字成為一個(gè)浮點(diǎn)數(shù)來(lái)解決這些差異(在Lua 5.2中所有的數(shù)字都是浮點(diǎn)數(shù)),特別是用常量結(jié)尾.0x = x + 0.0用來(lái)轉(zhuǎn)換變量。(這個(gè)建議僅僅是為了偶爾的不兼容性的一個(gè)快速修復(fù);它不是一個(gè)好的編程的一般指導(dǎo)。對(duì)于良好的編程,在需要浮點(diǎn)數(shù)和整數(shù)的地方使用浮點(diǎn)數(shù),在需要整數(shù)的地方。)

  • 如果float .0看起來(lái)像一個(gè)整數(shù),現(xiàn)在將float轉(zhuǎn)換為字符串會(huì)為結(jié)果添加后綴。(例如,float 2.0將被打印為2.0,而不是)2。當(dāng)您需要數(shù)字的特定格式時(shí),您應(yīng)始終使用明確的格式。(形式上這不是不兼容,因?yàn)長(zhǎng)ua沒(méi)有指定數(shù)字如何被格式化為字符串,但是某些程序采用了特定的格式。)

  • 垃圾收集器的世代模式被刪除。(這是Lua 5.2中的一個(gè)實(shí)驗(yàn)性功能。)

8.2 – Changes in the Libraries

  • bit32圖書(shū)館已被棄用。很容易要求兼容的外部庫(kù),或者更好的是用適當(dāng)?shù)陌次徊僮魈鎿Q它的功能。(請(qǐng)記住,bit32在32位整數(shù)上運(yùn)行,而Lua 5.3中的按位運(yùn)算符在Lua整數(shù)上運(yùn)行,默認(rèn)情況下有64位)。

  • 表格庫(kù)現(xiàn)在支持用于設(shè)置和獲取元素的元方法。

  • ipairs迭代器現(xiàn)在尊重元方法及其__ipairs元方法已被棄用。

  • 選項(xiàng)名稱中io.read沒(méi)有起始' *'了。為了兼容性,Lua將繼續(xù)接受(并忽略)這個(gè)角色。

  • 下面的功能已廢棄的數(shù)學(xué)庫(kù):atan2cosh,sinh,tanh,powfrexp,和ldexp。您可以替換math.pow(x,y)使用x^y; 你可以math.atan2math.atan它替換,現(xiàn)在可以接受一個(gè)或兩個(gè)參數(shù); 你可以math.ldexp(x,exp)x * 2.0^exp。替換。對(duì)于其他操作,您可以使用外部庫(kù)或在Lua中實(shí)施它們。

  • C裝載器的搜索者require改變了它處理版本名稱的方式?,F(xiàn)在,版本應(yīng)該在模塊名稱之后(正如大多數(shù)其他工具一樣)。為了兼容性,如果根據(jù)新樣式找不到打開(kāi)的函數(shù),那么該搜索器仍會(huì)嘗試舊格式。(Lua 5.2已經(jīng)以這種方式工作,但它沒(méi)有記錄變化。)

  • 該調(diào)用collectgarbage("count")現(xiàn)在只返回一個(gè)結(jié)果。(您可以從第一個(gè)結(jié)果的小數(shù)部分計(jì)算出第二個(gè)結(jié)果。)

8.3 – Changes in the API

  • 繼續(xù)功能現(xiàn)在接收作為參數(shù)他們需要通過(guò)lua_getctx,因此lua_getctx已被刪除。相應(yīng)地調(diào)整您的代碼。

  • 函數(shù)lua_dump有一個(gè)額外的參數(shù),strip。使用0作為此參數(shù)的值來(lái)獲取舊的行為。

  • 功能注入/項(xiàng)目無(wú)符號(hào)整數(shù)(lua_pushunsigned,lua_tounsigned,lua_tounsignedxluaL_checkunsigned,luaL_optunsigned)就被拋棄了。在類型轉(zhuǎn)換中使用他們的簽名等價(jià)物。

  • 宏項(xiàng)目非默認(rèn)的整數(shù)類型(luaL_checkint,luaL_optintluaL_checklong,luaL_optlong)就被拋棄了。使用lua_Integer類型轉(zhuǎn)換(或者,如果可能,請(qǐng)lua_Integer在代碼中使用)。

這里是擴(kuò)展BNF中Lua的完整語(yǔ)法。與擴(kuò)展的BNF一樣,{A}表示0或更多的As,A表示一個(gè)可選的A.(對(duì)于運(yùn)算符優(yōu)先級(jí),請(qǐng)參閱§3.4.8;有關(guān)終端名稱,數(shù)字和LiteralString的描述,請(qǐng)參閱§3.1。 )

chunk ::= block

block ::= {stat} [retstat]stat ::=  ‘;’ | 
	 varlist ‘=’ explist | 
	 functioncall | 
	 label | 
	 break | 
	 goto Name | 
	 do block end | 
	 while exp do block end | 
	 repeat block until exp | 
	 if exp then block {elseif exp then block} [else block] end | 
	 for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end | 
	 for namelist in explist do block end | 
	 function funcname funcbody | 
	 local function Name funcbody | 
	 local namelist [‘=’ explist] retstat ::= return [explist] [‘;’]label ::= ‘::’ Name ‘::’

funcname ::= Name {‘.’ Name} [‘:’ Name]varlist ::= var {‘,’ var}var ::=  Name | prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name 

namelist ::= Name {‘,’ Name}explist ::= exp {‘,’ exp}exp ::=  nil | false | true | Numeral | LiteralString | ‘...’ | functiondef | 
	 prefixexp | tableconstructor | exp binop exp | unop exp 

prefixexp ::= var | functioncall | ‘(’ exp ‘)’

functioncall ::=  prefixexp args | prefixexp ‘:’ Name args 

args ::=  ‘(’ [explist] ‘)’ | tableconstructor | LiteralString 

functiondef ::= function funcbody

funcbody ::= ‘(’ [parlist] ‘)’ block end

parlist ::= namelist [‘,’ ‘...’] | ‘...’

tableconstructor ::= ‘{’ [fieldlist] ‘}’

fieldlist ::= field {fieldsep field} [fieldsep]field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp

fieldsep ::= ‘,’ | ‘;’

binop ::=  ‘+’ | ‘-’ | ‘*’ | ‘/’ | ‘//’ | ‘^’ | ‘%’ | 
	 ‘&’ | ‘~’ | ‘|’ | ‘>>’ | ‘<<’ | ‘..’ | 
	 ‘<’ | ‘<=’ | ‘>’ | ‘>=’ | ‘==’ | ‘~=’ | 
	 and | or

unop ::= ‘-’ | not | ‘#’ | ‘~’
上一篇: 下一篇: