?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
標(biāo)準(zhǔn)的Lua庫(kù)提供了直接通過(guò)C API實(shí)現(xiàn)的有用功能。其中一些功能為語(yǔ)言提供基本服務(wù)(例如type
和getmetatable
); 其他人提供對(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
。
基礎(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.format
和io.write
。
rawequal (v1, v2)
檢查是否v1
等于v2
,而不調(diào)用__eq
metamethod。返回一個(gè)布爾值。
rawget (table, index)
獲取真正的價(jià)值table[index]
,而不用調(diào)用__index
metamethod。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)用__newindex
metamethod。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
使用v
as參數(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
。
這個(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
。
包庫(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ī),require
由package.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)的所有文件名。)
這個(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)值為i
1; j
is 的默認(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ù)的true值plain
會(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)/修飾符*
,h
,L
,l
,n
,和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
,a
,E
,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)A
和a
(十六進(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)制串v1
,v2
等堆積(即,在二進(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
; i
并j
可能是負(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)境。
在Lua圖案通過(guò)定期串,其通過(guò)模式匹配功能解釋為圖案描述string.find
,string.gmatch
,string.gsub
,和string.match
。本節(jié)介紹這些字符串的語(yǔ)法和含義(即它們匹配的內(nèi)容)。
字符類用于表示一組字符。描述字符類時(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
。
一個(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
,其中x和y是兩個(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。
第一個(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]
:int
用n
字節(jié)簽名(默認(rèn)是原生大?。?/p>
I[n]
:int
與n
字節(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
)。
該庫(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é)位置i
和j
(均包含)之間的所有字符中的代碼點(diǎn)(以整數(shù)形式)。缺省值i
是1和j
是i
。如果它遇到任何無(wú)效的字節(jié)序列,則會(huì)引發(fā)錯(cuò)誤。
utf8.len (s [, i [, j]])
返回s
在位置i
和j
(包括兩個(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字符串。
該庫(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
在位置pos
中list
,上移的元素list[pos], list[pos+1], ···, list[#list]
。pos
is 的缺省值#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]
。a2
is 的默認(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]
。
pos
is 的默認(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
。
這個(gè)庫(kù)提供了基本的數(shù)學(xué)函數(shù)。它提供了表格中的所有功能和常量math
。帶注釋“ integer/float
”的函數(shù)給出整數(shù)參數(shù)的整數(shù)結(jié)果,以及浮點(diǎn)(或混合)參數(shù)的浮點(diǎn)結(jié)果。舍入函數(shù)(math.ceil
,,math.floor
和math.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)值為x
1,以便該調(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)
返回x
by 的除法余數(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ù)稱為m
和n
,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ù)比較。
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.popen
,file: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ò)誤的字符串。
whence
is 的默認(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ò)誤的字符串。
這個(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
; 如果code
是false,返回的狀態(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
,month
和day
,并且可能有字段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.date
和os.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)刪除文件。
該庫(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)
返回給定value
或nil的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)用getinfo
2級(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ù)將該值value
與up
該函數(shù)的索引一起賦值f
。如果給定索引不存在上值,則函數(shù)返回nil。否則,它返回upvalue的名稱。
debug.setuservalue (udata, value)
將給定設(shè)置為與給定value
關(guān)聯(lián)的Lua值udata
。udata
必須是完整的用戶數(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)
使n1
Lua閉包f1
的n2
第 - 個(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_PATH
并LUA_CPATH
設(shè)置package.path
和package.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ā)生變化。
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é)尾.0
或x = 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)性功能。)
該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ù):atan2
,cosh
,sinh
,tanh
,pow
,frexp
,和ldexp
。您可以替換math.pow(x,y)
使用x^y
; 你可以math.atan2
用math.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é)果。)
繼續(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_tounsignedx
,luaL_checkunsigned
,luaL_optunsigned
)就被拋棄了。在類型轉(zhuǎn)換中使用他們的簽名等價(jià)物。
宏項(xiàng)目非默認(rèn)的整數(shù)類型(luaL_checkint
,luaL_optint
,luaL_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 | ‘#’ | ‘~’