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

characters

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

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

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

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

  • 包庫(第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é))。

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

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

6.1 – Basic Functions

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

assert (v [, message])

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

collectgarbage ([opt [, arg]])

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

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

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

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

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

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

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

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

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

dofile ([filename])

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

error (message [, level])

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

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

_G

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

getmetatable (object)

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

ipairs (t)

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

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

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

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

加載一個塊。

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

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

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

chunkname用作錯誤消息和調(diào)試信息塊的名稱(請參閱第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)制塊可能會導(dǎo)致解釋器崩潰。

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

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

next (table [, index])

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

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

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

pairs (t)

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

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

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

將遍歷表的所有鍵值對t

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

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

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

print (···)

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

rawequal (v1, v2)

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

rawget (table, index)

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

rawlen (v)

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

rawset (table, index, value)

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

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

select (index, ···)

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

setmetatable (table, metatable)

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

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

tonumber (e [, base])

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

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

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

tostring (v)

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

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

type (v)

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

_VERSION

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

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

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

6.2 – Coroutine Manipulation

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

coroutine.create (f)

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

coroutine.isyieldable ()

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

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

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

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

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

coroutine.running ()

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

coroutine.status (co)

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

coroutine.wrap (f)

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

coroutine.yield (···)

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

6.3 – Modules

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

require (modname)

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

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

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

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

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

package.config

描述包的一些編譯時配置的字符串。這個字符串是一系列的行:

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

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

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

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

  • 第五行是構(gòu)建luaopen_函數(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)你需要一個模塊modname并且package.loaded[modname]不是假的,require只需返回存儲在那里的值。

這個變量只是對真實表的引用; 賦給這個變量不會改變使用的表require。

package.loadlib (libname, funcname)

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

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

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

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

package.path

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

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

package.preload

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

這個變量只是對真實表的引用; 賦給這個變量不會改變使用的表require

package.searchers

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

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

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

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

第二個搜索器使用存儲在的路徑查找一個加載器作為Lua庫package.path。搜索按功能描述完成package.searchpath。

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

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

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

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

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

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

搜索給定name的給定path。

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

例如,如果路徑是字符串

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

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

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

6.4 – String Manipulation

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

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

字符串庫采用單字節(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ù)字代碼不一定是跨平臺移植的。

string.char (···)

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

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

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)(重新)加載時,那些upvalues會收到包含nil的新實例。(您可以使用調(diào)試庫以適合您需要的方式序列化并重新載入函數(shù)的upvalues。)

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

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

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

string.format (formatstring, ···)

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

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

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

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

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

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

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

string.gmatch (s, pattern)

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

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

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

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

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

對于這個函數(shù),^模式開頭的脫字符“ 不起作用”,因為這會阻止迭代。

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

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

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

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

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

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

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

這里有些例子:

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)

接收一個字符串并返回其長度。空字符串的""長度為0.嵌入的零計數(shù),"a\000bc\000"長度為5。

string.lower (s)

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

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

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

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

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

string.packsize (fmt)

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

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

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

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

string.reverse (s)

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

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

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

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

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

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

string.upper (s)

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

6.4.1 – Patterns

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

Character Class:

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

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

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

  • %a:代表所有字母。

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

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

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

  • %l:表示全部小寫字母。

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

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

  • %u:代表全部大寫字母。

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

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

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

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

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

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

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

圖案項目:

一個模式項目可以

  • 單個字符類,它匹配類中的任何單個字符;

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

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

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

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

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

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

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

模式:

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

捕獲:

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

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

6.4.2 – Format Strings for Pack and Unpack

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

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

  • <:設(shè)置小端

  • >:設(shè)置大端

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

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

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

  • B:一個無符號字節(jié)(char

  • h:簽名short(本地大小)

  • H:無符號short(原生大?。?/p>

  • l:簽名long(本地大小)

  • L:無符號long(原生大?。?/p>

  • j: 一個 lua_Integer

  • J: 一個 lua_Unsigned

  • T:a size_t(原生尺寸)

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

  • I[n]intn字節(jié)無符號(默認(rèn)為本地大?。?/p>

  • f:a float(原生尺寸)

  • d:a double(原生尺寸)

  • n: 一個 lua_Number

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

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

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

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

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

  • '':(空格)被忽略

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

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

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

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

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

6.5 – UTF-8 Support

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

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

utf8.char (···)

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

utf8.charpattern

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

utf8.codes (s)

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

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

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

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

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

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

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

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

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

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

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

6.6 – Table Manipulation

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

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

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

給定一個列表,其中所有元素都是字符串或數(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)插入一個調(diào)用。xt

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

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

返回目標(biāo)表a2

table.pack (···)

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

table.remove (list [, pos])

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

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

table.sort (list [, comp])

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

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

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

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

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

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

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

6.7 – Mathematical Functions

這個庫提供了基本的數(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ù),否則返回浮點(diǎn)數(shù)。

math.abs (x)

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

math.acos (x)

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

math.asin (x)

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

math.atan (y [, x])

返回y/x(以弧度為單位)的反正切,但使用兩個參數(shù)的符號來查找結(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是自然對數(shù)的底數(shù))。

math.floor (x)

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

math.fmod (x, y)

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

math.huge

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

math.log (x [, base])

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

math.max (x, ···)

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

math.maxinteger

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

math.min (x, ···)

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

math.mininteger

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

math.modf (x)

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

math.pi

π的值。

math.rad (x)

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

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

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

math.tan (x)

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

math.tointeger (x)

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

math.type (x)

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

math.ult (m, n)

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

6.8 – Input and Output Facilities

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

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

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

除非另有說明,否則所有I / O函數(shù)在失敗時都會返回nil(作為第二個結(jié)果加上一個錯誤消息,并將第三個結(jié)果作為依賴于系統(tǒng)的錯誤代碼),并且某些值與成功時的值不同。在非POSIX系統(tǒng)上,在發(fā)生錯誤時計算錯誤消息和錯誤代碼可能不是線程安全的,因為它們依賴于全局C變量errno。

io.close ([file])

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

io.flush ()

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

io.input ([file])

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

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

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

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

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

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

io.open (filename [, mode])

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

mode字符串可以是下列任何一項:

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

  • w”:寫入模式;

  • a”:追加模式;

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

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

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

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

io.output ([file])

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

io.popen (prog [, mode])

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

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

io.read (···)

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

io.tmpfile ()

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

io.type (obj)

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

io.write (···)

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

file:close ()

關(guān)閉file。請注意,文件在垃圾回收處理時會自動關(guān)閉,但需要花費(fèi)無法預(yù)測的時間。

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

file:flush ()

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

file:lines (···)

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

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

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

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

file:read (···)

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

可用的格式是

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

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

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

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

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

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

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

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

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

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

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

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

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

file:setvbuf (mode [, size])

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

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

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

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

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

file:write (···)

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

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

6.9 – Operating System Facilities

這個庫是通過表來實現(xiàn)的os。

os.clock ()

返回程序使用的CPU時間量的近似值。

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

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

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

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

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

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

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

os.difftime (t2, t1)

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

os.execute ([command])

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

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

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

當(dāng)沒有調(diào)用時commandos.execute返回一個布爾值,如果shell可用,則返回true。

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

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

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

os.getenv (varname)

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

os.remove (filename)

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

os.rename (oldname, newname)

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

os.setlocale (locale [, category])

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

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

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

這個函數(shù)可能不是線程安全的,因為它依賴于C函數(shù)setlocale。

os.time ([table])

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

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

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

os.tmpname ()

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

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

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

6.10 – The Debug Library

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

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

debug.debug ()

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

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

debug.gethook ([thread])

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

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

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

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

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

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

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

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

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

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

debug.getmetatable (value)

返回給定valuenil的metatable,如果它沒有metatable。

debug.getregistry ()

返回注冊表表(請參閱§4.5)。

debug.getupvalue (f, up)

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

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

debug.getuservalue (u)

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

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

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

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

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

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

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

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

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

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

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

請參閱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不作處理返回。否則,它將返回一個帶有回調(diào)調(diào)用堆棧的字符串??蛇xmessage字符串被追加到回溯的開頭。一個可選的level數(shù)字告訴在哪個級別開始回溯(默認(rèn)是1,函數(shù)調(diào)用traceback)。

debug.upvalueid (f, n)

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

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

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

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

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

lua [options] [script [args]]

選項是:

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

  • -l mod:“需要” mod ;

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

  • -v:打印版本信息;

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

  • --:停止處理選項;

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

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

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

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

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

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

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

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

$ lua -la b.lua t1 t2

表是這樣的:

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

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

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

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

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

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

如果腳本中存在未受保護(hù)的錯誤,解釋器會將錯誤報告給標(biāo)準(zhǔn)錯誤流。如果錯誤對象不是一個字符串,但有一個metamethod __tostring,解釋器會調(diào)用這個metamethod來產(chǎn)生最終的消息。否則,解釋器會將錯誤對象轉(zhuǎn)換為字符串并向其添加堆棧回溯。

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

為了允許在Unix系統(tǒng)中使用Lua作為腳本解釋器,獨(dú)立解釋器跳過塊開始的塊的第一行#。因此,Lua腳本可以通過使用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時可能遇到的不兼容問題。你可以通過用適當(dāng)?shù)倪x項編譯Lua來避免一些不兼容(見文件luaconf.h)。但是,所有這些兼容性選項將在未來取消。

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

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

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

8.1 – Changes in the Language

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

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

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

8.2 – Changes in the Libraries

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

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

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

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

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

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

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

8.3 – Changes in the API

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

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

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

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

這里是擴(kuò)展BNF中Lua的完整語法。與擴(kuò)展的BNF一樣,{A}表示0或更多的As,A表示一個可選的A.(對于運(yùn)算符優(yōu)先級,請參閱§3.4.8;有關(guān)終端名稱,數(shù)字和LiteralString的描述,請參閱§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 | ‘#’ | ‘~’
Previous article: Next article: