Nvim :help
頁面,從 原始碼 使用 tree-sitter-vimdoc 解析器 生成。
{ a }
表示 0 個或多個 a
,而 [ a ]
表示可選的 a
。and break do else elseif end false for function if in local nil not or repeat return then true until while
and
是一個保留字,但 And
和 AND
是兩個不同的有效名稱。按照慣例,以底線開頭,後跟大寫字母(例如 _VERSION
)的名稱是為 Lua 使用的內部全域變數保留的。+ - * / % ^ # == ~= <= >= < > = ( ) { } [ ] ; : , . .. ...
\a
響鈴\b
退格\f
換頁\n
換行\r
返回\t
水平制表符\v
垂直制表符\\
反斜線\"
引號(雙引號)\'
單引號(單引號)\ddd
指定其數值,其中 ddd
是一個最多三位十進位數字的序列。(請注意,如果要使數字跳脫符號後跟數字,則必須使用正好三位數字表示。)Lua 中的字串可以包含任何 8 位值,包括嵌入的零,可以指定為 \0
。[[
,1 級的開長括號寫為 [=[
,依此類推。類似地定義閉長括號;例如,4 級的閉長括號寫為 ]====]
。長字串以任何級別的開長括號開始,並在第一個相同級別的閉長括號處結束。此括號形式中的字面值可以跨越多行,不解釋任何跳脫序列,並且忽略任何其他級別的長括號。它們可以包含任何內容,除了正確級別的閉括號。a
編碼為 97,換行符編碼為 10,1
編碼為 49),以下五個字面值表示相同的字串a = 'alo\n123"'
a = "alo\n123\""
a = '\97lo\10\04923"'
a = [[alo
123"]]
a = [==[
alo
123"]==]
0x
。有效數值常數的範例為3 3.0 3.1416 314.16e-2 0.31416E1 0xff 0x56
--
) 開頭,位於字串外的任何位置。如果 --
後面的文字不是開長括號,則註解是短註解,將執行到行尾。否則,它是長註解,將執行到對應的閉長括號。長註解經常被用來暫時停用程式碼。nil
、boolean
、number
、string
、function
、userdata
、thread
和 table
。Nil 是值 nil
的類型,其主要特性是與任何其他值不同;它通常表示缺少有用的值。Boolean 是值 false
和 true
的類型。nil
和 false
都會使條件為 false;任何其他值都會使條件為 true。Number 表示實數(雙精度浮點數)。(很容易建立使用其他內部表示數值(例如單精度浮點數或長整數)的 Lua 直譯器;請參閱檔案 luaconf.h
。)String 表示字元陣列。Lua 是 8 位元清除的:字串可以包含任何 8 位元字元,包括嵌入的零 (\0
)(請參閱 lua-literal)。thread
類型表示獨立的執行緒,用於實作協同程式(請參閱 lua-coroutine)。請勿將 Lua 執行緒與作業系統執行緒混淆。Lua 在所有系統上都支援協同程式,即使是那些不支援執行緒的系統。table
類型實作關聯陣列,也就是說,可以使用數字以及任何值(nil
除外)作為索引的陣列。表格可以是異質的;也就是說,它們可以包含所有類型的值(nil
除外)。表格是 Lua 中唯一資料結構機制;它們可以用來表示普通陣列、符號表、集合、記錄、圖形、樹狀結構等。為了表示記錄,Lua 使用欄位名稱作為索引。該語言透過提供 a.name
作為 a["name"]
的語法糖來支援這種表示。在 Lua 中建立表格有多種方便的方法(請參閱 lua-tableconstructor)。nil
除外)。特別是,由於函式是一級值,因此表格欄位可能包含函式。因此,表格也可以攜帶方法(請參閱 lua-function-define)。type
函式會回傳一個字串,描述給定值的類型(請參閱 lua-type())。format
函式(請參閱 string.format())。var ::= Name
nil
。var ::= prefixexp [ exp ]
var.NAME
只是 var["NAME"]
的語法糖。var ::= prefixexp . Name
getfenv
(請參閱 lua_getfenv())。若要取代它,請呼叫 setfenv
(請參閱 setfenv())。 (您只能透過除錯函式庫來操作 C 函式的環境;請參閱 lua-lib-debug。)x
等同於 _env.x
,而這又等同於gettable_event(_env, "x")
_env
是執行函式的環境。(_env
變數未在 Lua 中定義。我們在這裡使用它僅用於說明目的。)t[i]
等同於呼叫 gettable_event(t,i)
。(請參閱 lua-metatable 以了解 gettable_event
函式的完整說明。此函式未在 Lua 中定義或可呼叫。我們在這裡使用它僅用於說明目的。)chunk ::= {stat [ ; ]}
;;
不是合法的。luac
以了解詳細資訊。來源和已編譯形式的程式可以互換;Lua 會自動偵測檔案類型並採取相應的動作。block ::= chunk
stat ::= varlist1 = explist1 varlist1 ::= var { , var } explist1 ::= exp { , exp }
nil
擴充清單。如果表達式清單以函式呼叫結尾,則此呼叫所回傳的所有值都會在調整之前進入值的清單中(除非呼叫包含在括號中;請參閱 lua-expressions)。i = 3
i, a[i] = i+1, 20
a[3]
設定為 20,而不會影響 a[4]
,因為 a[i]
中的 i
會在賦值為 4 之前評估(為 3)。同樣地,這一行x, y = y, x
x
和 y
的值。t[i] = val
等同於 settable_event(t,i,val)
。(請參閱 lua-metatable 以了解 settable_event
函式的完整說明。此函式未在 Lua 中定義或可呼叫。我們在這裡使用它僅用於說明目的。)x = val
等同於賦值 _env.x = val
,而這又等同於settable_event(_env, "x", val)
_env
是執行函式的環境。(_env
變數未在 Lua 中定義。我們在這裡使用它僅用於說明目的。)if
、while
和 repeat
具有通常的意義和熟悉的語法。stat ::= while exp do block end stat ::= repeat block until exp stat ::= if exp then block { elseif exp then block } [ else block ] end
for
陳述式,有兩種形式(請參閱 lua-for)。false
和 nil
都被視為 false。所有與 nil
和 false
不同的值都被視為 true(特別是,數字 0 和空字串也被視為 true)。repeat-until
迴圈中,內部區塊不會在 until
關鍵字處結束,而是在條件之後才結束。因此,條件可以參考在迴圈區塊內宣告的區域變數。stat ::=
return
[explist1]
stat ::=
break
break
會結束最內層的封閉迴圈。return
和 break
陳述式只能寫為區塊的last
陳述式。如果確實需要在區塊中間 return
或 break
,則可以使用明確的內部區塊,例如慣用語 do return end
和 do break end
,因為現在 return
和 break
是它們的(內部)區塊中的最後一個陳述式。for
陳述式有兩種形式:一種是數值形式,一種是通用形式。for
迴圈會重複執行程式碼區塊,同時控制變數會執行算術級數。它具有以下語法stat ::= for Name = exp , exp [ , exp ] do block end
block
會重複執行,name
從第一個 exp
的值開始,直到它以第三個 exp
的步進值通過第二個 exp
。更精確地說,類似於以下的 for
陳述式for var = e1, e2, e3 do block end
do
local var, limit, step = tonumber(e1), tonumber(e2), tonumber(e3)
if not ( var and limit and step ) then error() end
while ( step >0 and var <= limit )
or ( step <=0 and var >= limit ) do
block
var = var + step
end
end
var
、limit
和 step
是不可見的變數。這裡的名稱僅用於說明目的。break
來結束 for
迴圈。var
是迴圈的區域變數;您無法在 for
結束或中斷後使用其值。如果您需要此值,請在結束或中斷迴圈之前將其賦值給另一個變數。for
陳述式會處理稱為 iterator 的函式。在每次迭代時,都會呼叫 iterator 函式來產生新值,並在新值為 nil
時停止。通用 for
迴圈具有以下語法stat ::= for namelist in explist1 do block end namelist ::= Name { , Name }
for
陳述式for
var1, ..., varn
in
explist
do
block
end
do
local f, s, var = explist
while true do
local var1, ..., varn = f(s, var)
var = var1
if var == nil then break end
block
end
end
explist
。其結果是一個 iterator 函式、一個 state
以及第一個 iterator 變數的初始值。f
、s
和 var
是不可見的變數。這裡的名稱僅用於說明目的。break
來結束 for
迴圈。var1, ..., varn
是迴圈的區域變數;您無法在 for
結束後使用其值。如果您需要這些值,請在結束或中斷迴圈之前將其賦值給其他變數。stat ::= functioncall
stat ::= local namelist [ = explist1 ] namelist ::= Name { , Name }
nil
初始化。exp ::= prefixexp exp ::= nil | false | true exp ::= Number exp ::= String exp ::= function exp ::= tableconstructor exp ::= ... exp ::= exp binop exp exp ::= unop exp prefixexp ::= var | functioncall | ( exp )
...
) 表示,只能在可變參數函式內部使用;它們在 lua-function-define 中說明。not
(請參閱 lua-logicalop) 和一元長度運算子 (請參閱 lua-length)。f() -- adjusted to 0 results
g(f(), x) -- f() is adjusted to 1 result
g(x, f()) -- g gets x plus all results from f()
a,b,c = f(), x -- f() is adjusted to 1 result (c gets nil)
a,b = ... -- a gets the first vararg parameter, b gets
-- the second (both a and b may get nil if there
-- is no corresponding vararg parameter)
a,b,c = x, f() -- f() is adjusted to 2 results
a,b,c = f() -- f() is adjusted to 3 results
return f() -- returns all results from f()
return ... -- returns all received vararg parameters
return x,y,f() -- returns x, y, and all results from f()
{f()} -- creates a list with all results from f()
{...} -- creates a list with all vararg parameters
{f(), nil} -- f() is adjusted to 1 result
(f(x,y,z))
永遠是一個單一值,即使 f
回傳多個值也是如此。((f(x,y,z))
的值是 f
回傳的第一個值,如果 f
沒有回傳任何值,則為 nil
。)+
(加法)、-
(減法)、*
(乘法)、/
(除法)、%
(模數) 和 ^
(指數);以及一元 -
(負號)。如果運算元是數字,或可以轉換為數字的字串 (請參閱 lua-coercion),則所有運算都具有通常的含義。指數運算適用於任何指數。例如,x^(-0.5)
計算 x
平方根的倒數。模數定義為a % b == a - math.floor(a/b)*b
== ~= < > <= >=
false
或 true
。==
) 首先比較運算元的類型。如果類型不同,則結果為 false
。否則,將比較運算元的值。數字和字串以通常的方式進行比較。物件 (表格、userdata、執行緒和函式) 按參考進行比較:只有當兩個物件是同一個物件時,才認為它們相等。每次您建立一個新的物件 (表格、userdata 或函式) 時,這個新的物件都與任何先前存在的物件不同。~=
正好是相等 (==
) 的否定。and or not
not
總是回傳 false
或 true
。連詞運算子 and
如果第一個參數的值為 false
或 nil
,則回傳第一個參數;否則,and
會回傳第二個參數。析取運算子 or
如果第一個參數的值與 nil
和 false
不同,則回傳第一個參數;否則,or
會回傳第二個參數。and
和 or
都使用短路求值,也就是說,只有在必要時才會評估第二個運算元。以下是一些範例10 or 20 --> 10 10 or error() --> 10 nil or "a" --> "a" nil and 10 --> nil false and error() --> false false and nil --> false false or nil --> nil 10 and 20 --> 20
-->
表示前一個表達式的結果。)..
) 表示。如果兩個運算元都是字串或數字,則會根據 lua-coercion 中提及的規則將它們轉換為字串。否則,會呼叫 "concat" 元方法 (請參閱 lua-metatable)。#
表示。字串的長度是其位元組數 (也就是說,當每個字元都是一個位元組時,字串長度的通常含義)。t
的長度定義為任何整數索引 n
,使得 t[n]
不是 nil
且 t[n+1]
是 nil
;此外,如果 t[1]
是 nil
,則 n
可以為零。對於一個常規陣列,其中從 1 到給定的 n
的值都不是 nil,其長度正好是該 n
,即其最後一個值的索引。如果陣列有「空洞」(也就是說,在其他非 nil 值之間存在 nil
值),則 #t
可以是直接位於 nil
值之前的任何索引 (也就是說,它可以將任何此類 nil
值視為陣列的結尾)。or and < > <= >= ~= == .. + - * / not # - (unary) ^
..
) 和指數 (^
) 運算子是右結合的。所有其他二元運算子都是左結合的。tableconstructor ::= { [ fieldlist ] } fieldlist ::= field { fieldsep field } [ fieldsep ] field ::= [ exp ] = exp | Name = exp | exp fieldsep ::= , | ;
[exp1] = exp2
的欄位都會將一個鍵為 exp1
、值為 exp2
的條目新增到新表格中。形式為 name = exp
的欄位等效於 ["name"] = exp
。最後,形式為 exp
的欄位等效於 [i] = exp
,其中 i
是從 1 開始的連續數字整數。其他格式的欄位不會影響此計數。例如,a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }
do
local t = {}
t[f(1)] = g
t[1] = "x" -- 1st exp
t[2] = "y" -- 2nd exp
t.x = 1 -- temp["x"] = 1
t[3] = f(x) -- 3rd exp
t[30] = 23
t[4] = 45 -- 4th exp
a = t
end
exp
的形式,且該表達式是函式呼叫,則呼叫回傳的所有值都會連續輸入列表 (請參閱 lua-function)。為了避免這種情況,請將函式呼叫括在括號中 (請參閱 lua-expressions)。functioncall ::= prefixexp args
prefixexp
和 args
。如果 prefixexp
的值具有 function
類型,則會使用給定的引數呼叫此函式。否則,會呼叫 prefixexp
「呼叫」元方法,其第一個參數為 prefixexp
的值,後接原始呼叫引數 (請參閱 lua-metatable)。functioncall ::= prefixexp : Name args
v:name(
args
)
是 v.name(v,
args
)
的語法糖,但 v
只會評估一次。args ::= ( [ explist1 ] ) args ::= tableconstructor args ::= String
f{
fields
}
的呼叫是 f({
fields
})
的語法糖,也就是說,引數列表是一個新的單一表格。形式為 f'
string
'
(或 f"
string
"
或 f[[
string
]]
) 的呼叫是 f('
string
')
的語法糖,也就是說,引數列表是一個單一字串常值。(
之前放置換行符號。此限制避免了語言中的一些歧義。如果您寫a = f
(g).x(a)
a = f(g).x(a)
。因此,如果您想要兩個陳述句,則必須在它們之間新增分號。如果您真的想要呼叫 f
,則必須移除 (g)
之前的換行符號。return
functioncall
的呼叫稱為尾呼叫。Lua 實作了正確的尾呼叫 (或正確的尾遞迴):在尾呼叫中,被呼叫的函式會重複使用呼叫函式的堆疊項目。因此,程式可以執行的巢狀尾呼叫數量沒有限制。但是,尾呼叫會清除有關呼叫函式的任何偵錯資訊。請注意,尾呼叫只會發生在特定語法中,其中 return
只有一個函式呼叫作為引數;此語法會讓呼叫函式完全回傳被呼叫函式的回傳值。因此,以下範例都不是尾呼叫return (f(x)) -- results adjusted to 1
return 2 * f(x)
return x, f(x) -- additional results
f(x); return -- results discarded
return x or f(x) -- results adjusted to 1
function ::= function funcbody funcbody ::= ( [ parlist1 ] ) block end
stat ::= function funcname funcbody stat ::= local function Name funcbody funcname ::= Name { . Name } [ : Name ]
function f ()
body
end
f = function ()
body
end
function t.a.b.c.f ()
body
end
t.a.b.c.f = function ()
body
end
local function f ()
body
end
local f; f = function f ()
body
end
local f = function f ()
body
end
f
的參考時,這才會產生差異。)function
類型。當 Lua 預編譯一個程式碼塊時,它所有的函式主體也會被預編譯。然後,每當 Lua 執行函式定義時,該函式就會被實例化(或封閉)。這個函式實例(或閉包)是表達式的最終值。同一個函式的不同實例可能會參考不同的外部區域變數,並且可能具有不同的環境表。parlist1 ::= namelist [ , ... ] | ...
...
)來表示。變長引數函式不會調整其引數列表;相反地,它會收集所有額外的引數,並透過一個也寫成三個點的變長引數表達式將它們提供給函式。此表達式的值是一個包含所有實際額外引數的列表,類似於具有多個結果的函式。如果變長引數表達式在另一個表達式內部或在表達式列表的中間使用,那麼它的返回列表會被調整為一個元素。如果該表達式作為表達式列表的最後一個元素使用,則不會進行調整(除非該呼叫被括在括號中)。function f(a, b) end
function g(a, b, ...) end
function r() return 1,2,3 end
CALL PARAMETERS f(3) a=3, b=nil f(3, 4) a=3, b=4 f(3, 4, 5) a=3, b=4 f(r(), 10) a=1, b=10 f(r()) a=1, b=2 g(3) a=3, b=nil, ... --> (nothing) g(3, 4) a=3, b=4, ... --> (nothing) g(3, 4, 5, 8) a=3, b=4, ... --> 5 8 g(5, r()) a=5, b=1, ... --> 2 3
function t.a.b.c:f (
params
)
body
end
t.a.b.c:f = function (
self
, params
)
body
end
x = 10 -- global variable
do -- new block
local x = x -- new `x`, with value 10
print(x) --> 10
x = x+1
do -- another block
local x = x+1 -- another `x`
print(x) --> 12
end
print(x) --> 11
end
print(x) --> 10 (the global one)
local x = x
這樣的宣告中,正在宣告的新 x
尚未進入作用域,因此第二個 x
指的是外部變數。a = {}
local x = 20
for i=1,10 do
local y = 0
a[i] = function () y=y+1; return x+y end
end
y
變數,而它們都共享同一個 x
。"__add"
欄位是否有函式。如果找到函式,Lua 會呼叫該函式來執行加法。getmetatable
函式(請參閱 getmetatable())查詢任何值的元表。setmetatable
函式(請參閱 setmetatable())取代表格的元表。您無法從 Lua 變更其他類型的元表(使用除錯函式庫除外);您必須使用 C API 來進行變更。__
為前綴;例如,運算「add」的鍵是字串「__add」。這些運算的語意由描述直譯器如何執行該運算的 Lua 函式更好地解釋。rawget
、tonumber
等)都在 lua-lib-core 中描述。特別是,為了檢索給定物件的元方法,我們使用表達式metatable(obj)[event]
rawget(metatable(obj) or {}, event)
nil
)。getbinhandler
函式定義了 Lua 如何為二元運算選擇處理常式。首先,Lua 嘗試第一個運算元。如果其類型沒有為運算定義處理常式,則 Lua 會嘗試第二個運算元。function getbinhandler (op1, op2, event)
return metatable(op1)[event] or metatable(op2)[event]
end
op1 + op2
的行為是function add_event (op1, op2)
local o1, o2 = tonumber(op1), tonumber(op2)
if o1 and o2 then -- both operands are numeric?
return o1 + o2 -- `+` here is the primitive `add`
else -- at least one of the operands is not numeric
local h = getbinhandler(op1, op2, "__add")
if h then
-- call the handler with both operands
return h(op1, op2)
else -- no handler available: default behavior
error(...)
end
end
end
-
運算。function unm_event (op)
local o = tonumber(op)
if o then -- operand is numeric?
return -o -- `-` here is the primitive `unm`
else -- the operand is not numeric.
-- Try to get a handler from the operand
local h = metatable(op).__unm
if h then
-- call the handler with the operand
return h(op)
else -- no handler available: default behavior
error(...)
end
end
end
..
(串聯)運算。function concat_event (op1, op2)
if (type(op1) == "string" or type(op1) == "number") and
(type(op2) == "string" or type(op2) == "number") then
return op1 .. op2 -- primitive string concatenation
else
local h = getbinhandler(op1, op2, "__concat")
if h then
return h(op1, op2)
else
error(...)
end
end
end
#
運算。function len_event (op)
if type(op) == "string" then
return strlen(op) -- primitive string length
elseif type(op) == "table" then
return #op -- primitive table length
else
local h = metatable(op).__len
if h then
-- call the handler with the operand
return h(op)
else -- no handler available: default behavior
error(...)
end
end
end
getcomphandler
定義了 Lua 如何為比較運算子選擇元方法。只有當被比較的兩個物件具有相同的類型並且對於所選的運算具有相同的元方法時,才會選擇元方法。function getcomphandler (op1, op2, event)
if type(op1) ~= type(op2) then return nil end
local mm1 = metatable(op1)[event]
local mm2 = metatable(op2)[event]
if mm1 == mm2 then return mm1 else return nil end
end
function eq_event (op1, op2)
if type(op1) ~= type(op2) then -- different types?
return false -- different objects
end
if op1 == op2 then -- primitive equal?
return true -- objects are equal
end
-- try metamethod
local h = getcomphandler(op1, op2, "__eq")
if h then
return h(op1, op2)
else
return false
end
end
a ~= b
等同於 not (a == b)
。<
運算。function lt_event (op1, op2)
if type(op1) == "number" and type(op2) == "number" then
return op1 < op2 -- numeric comparison
elseif type(op1) == "string" and type(op2) == "string" then
return op1 < op2 -- lexicographic comparison
else
local h = getcomphandler(op1, op2, "__lt")
if h then
return h(op1, op2)
else
error(...);
end
end
end
a > b
等同於 b < a
。<=
運算。function le_event (op1, op2)
if type(op1) == "number" and type(op2) == "number" then
return op1 <= op2 -- numeric comparison
elseif type(op1) == "string" and type(op2) == "string" then
return op1 <= op2 -- lexicographic comparison
else
local h = getcomphandler(op1, op2, "__le")
if h then
return h(op1, op2)
else
h = getcomphandler(op1, op2, "__lt")
if h then
return not h(op2, op1)
else
error(...);
end
end
end
end
a >= b
等同於 b <= a
。請注意,在沒有「le」元方法的情況下,Lua 會嘗試「lt」,假設 a <= b
等同於 not (b < a)
。table[key]
。function gettable_event (table, key)
local h
if type(table) == "table" then
local v = rawget(table, key)
if v ~= nil then return v end
h = metatable(table).__index
if h == nil then return nil end
else
h = metatable(table).__index
if h == nil then
error(...);
end
end
if type(h) == "function" then
return h(table, key) -- call the handler
else return h[key] -- or repeat operation on it
end
table[key] = value
。function settable_event (table, key, value)
local h
if type(table) == "table" then
local v = rawget(table, key)
if v ~= nil then rawset(table, key, value); return end
h = metatable(table).__newindex
if h == nil then rawset(table, key, value); return end
else
h = metatable(table).__newindex
if h == nil then
error(...);
end
end
if type(h) == "function" then
return h(table, key,value) -- call the handler
else h[key] = value -- or repeat operation on it
end
function function_event (func, ...)
if type(func) == "function" then
return func(...) -- primitive call
else
local h = metatable(func).__call
if h then
return h(func, ...)
else
error(...)
end
end
end
setfenv
來變更 Lua 函式或執行中執行緒的環境。您可以透過呼叫 getfenv
來取得 Lua 函式或執行中執行緒的環境(請參閱 lua_getfenv())。若要操作其他物件(userdata、C 函式、其他執行緒)的環境,您必須使用 C API。lua_gc
(請參閱 lua_gc())或在 Lua 中呼叫 collectgarbage
(請參閱 collectgarbage())來變更這些數字。兩者都取得百分比點作為引數(因此 100 的引數表示實際值為 1)。您也可以使用這些函式直接控制收集器(例如,停止並重新啟動)。__gc
欄位的垃圾 userdata 不會立即由垃圾收集器收集。相反地,Lua 會將它們放在一個列表中。在收集之後,Lua 會針對該列表中每個 userdata 執行相當於下列函式的動作function gc_event (udata)
local h = metatable(udata).__gc
if h then
h(udata)
end
end
__mode
欄位的值控制。如果 __mode
欄位是一個包含字元 k
的字串,則表格中的鍵為弱鍵。如果 __mode
包含 v
,則表格中的值為弱值。__mode
欄位的值。否則,由此元表格控制的表格的弱行為是未定義的。coroutine.create
來建立協程(請參閱 coroutine.create())。其唯一引數是一個函式,該函式是協程的主要函式。create
函式只會建立一個新的協程並傳回其控制代碼(類型為 thread
的物件);它不會開始協程執行。coroutine.resume
(請參閱 coroutine.resume()),並將 coroutine.create
傳回的執行緒作為其第一個引數時,協程會從其主要函式的第一行開始執行。傳遞給 coroutine.resume
的額外引數會傳遞給協程主要函式。在協程開始執行後,它會執行到終止或 yields
。coroutine.resume
會傳回 true
,以及協程主要函式傳回的任何值。在發生錯誤時,coroutine.resume
會傳回 false
以及錯誤訊息。coroutine.yield
來 yield(請參閱 coroutine.yield())。當協程 yield 時,對應的 coroutine.resume
會立即傳回,即使 yield 發生在巢狀函式呼叫內(也就是說,不是在主要函式中,而是在主要函式直接或間接呼叫的函式中)。在 yield 的情況下,coroutine.resume
也會傳回 true
,以及傳遞給 coroutine.yield
的任何值。下次您恢復同一個協程時,它會從它 yield 的點繼續執行,對 coroutine.yield
的呼叫會傳回傳遞給 coroutine.resume
的任何額外引數。coroutine.create
類似,coroutine.wrap
函式(請參閱 coroutine.wrap())也會建立協程,但是它不是傳回協程本身,而是傳回一個函式,該函式在被呼叫時會恢復協程。傳遞給此函式的任何引數都會作為額外引數傳遞給 coroutine.resume
。coroutine.wrap
會傳回 coroutine.resume
傳回的所有值,除了第一個值(布林錯誤碼)。與 coroutine.resume
不同,coroutine.wrap
不會捕獲錯誤;任何錯誤都會傳播給呼叫者。function foo1 (a)
print("foo", a)
return coroutine.yield(2*a)
end
co = coroutine.create(function (a,b)
print("co-body", a, b)
local r = foo1(a+1)
print("co-body", r)
local r, s = coroutine.yield(a+b, a-b)
print("co-body", r, s)
return b, "end"
end)
print("main", coroutine.resume(co, 1, 10))
print("main", coroutine.resume(co, "r"))
print("main", coroutine.resume(co, "x", "y"))
print("main", coroutine.resume(co, "x", "y"))
co-body 1 10 foo 2 main true 4 co-body r main true 11 -9 co-body x y main true 10 end main false cannot resume dead coroutine
lua.h
中。macro
的形式提供。所有這類巨集都只會精確使用每個引數一次(第一個引數除外,它始終是 Lua 狀態),因此不會產生隱藏的副作用。luaconf.h
中使用巨集 luai_apicheck
的適當定義編譯 Lua 來變更此行為。nil
、數字、字串等)。n
個元素,則索引 1 表示第一個元素(也就是說,第一個被推入堆疊的元素),而索引 n
表示最後一個元素;索引 -1
也表示最後一個元素(也就是說,位於頂部的元素),而索引 -n
表示第一個元素。如果索引位於 1 和堆疊頂部之間(也就是說,如果 1 <= abs(index) <= top
),則我們稱該索引為有效索引。lua_checkstack
來增加堆疊大小(請參閱 lua_checkstack())。LUA_MINSTACK
個堆疊位置可用。LUA_MINSTACK
定義為 20,因此通常您不必擔心堆疊空間,除非您的程式碼有迴圈將元素推入堆疊。lua_checkstack
設定的最大堆疊大小。此類索引稱為可接受索引。更正式地說,我們將可接受索引定義如下(index < 0 && abs(index) <= top) || (index > 0 && index <= stackspace)
LUA_GLOBALSINDEX
。正在執行的 C 函式的環境始終位於偽索引 LUA_ENVIRONINDEX
。lua_getfield(L, LUA_GLOBALSINDEX, varname);
lua_upvalueindex
產生。與函式關聯的第一個值位於位置 lua_upvalueindex(1)
,依此類推。任何對 lua_upvalueindex(
n
)
的存取,其中 n
大於目前函式的向上值數量,都會產生一個可接受(但無效)的索引。LUA_REGISTRYINDEX
。任何 C 程式庫都可以將資料儲存到此表格中,但它應注意選擇與其他程式庫所用不同的索引鍵,以避免衝突。通常,您應使用包含您的程式庫名稱的字串或帶有 C 程式碼中 C 物件位址的輕量使用者資料作為索引鍵。longjmp
功能來處理錯誤。(如果您使用 C++,也可以選擇使用例外狀況;請參閱檔案 luaconf.h
。)當 Lua 面臨任何錯誤(例如記憶體配置錯誤、類型錯誤、語法錯誤和執行階段錯誤)時,它會引發錯誤;也就是說,它會執行長跳躍。受保護的環境使用 setjmp
來設定恢復點;任何錯誤都會跳到最近的活動恢復點。lua_newstate
、lua_close
、lua_load
、lua_pcall
和 lua_cpcall
(請參閱 lua_newstate()、lua_close()、lua_load()、lua_pcall() 和 lua_cpcall())。lua_error
來引發錯誤(請參閱 lua_error())。realloc
的功能,但並不完全相同。其引數為 ud
,一個傳遞給 lua_newstate
的不透明指標(請參閱 lua_newstate());ptr
,一個指向要配置/重新配置/釋放的區塊的指標;osize
,區塊的原始大小;nsize
,區塊的新大小。當且僅當 osize
為零時,ptr
才為 NULL
。當 nsize
為零時,配置器必須傳回 NULL
;如果 osize
不為零,則它應釋放 ptr
指向的區塊。當 nsize
不為零時,當且僅當配置器無法滿足請求時,配置器才會傳回 NULL
。當 nsize
不為零且 osize
為零時,配置器應像 malloc
一樣運作。當 nsize
和 osize
都不為零時,配置器應像 realloc
一樣運作。Lua 假設當 `osize >= nsize` 時,配置器永遠不會失敗。luaL_newstate
使用(請參閱 luaL_newstate())。static void *l_alloc (void *ud, void *ptr, size_t osize,
size_t nsize) {
(void)ud; (void)osize; /* not used */
if (nsize == 0) {
free(ptr);
return NULL;
}
else
return realloc(ptr, nsize);
}
free(NULL)
沒有效果,且 realloc(NULL, size)
等同於 malloc(size)
。ANSI C 確保這兩種行為。panic
function
,然後呼叫 exit(EXIT_FAILURE)
,從而結束主機應用程式。您的 panic 函式可以透過永不傳回(例如,執行長跳躍)來避免此結束。lua_call
;nargs
是您推入堆疊的引數數量。呼叫函式時,會從堆疊中彈出所有引數和函式值。函式傳回時,會將函式結果推入堆疊。除非 nresults
為 LUA_MULTRET
,否則結果數量會調整為 nresults
。在這種情況下,會推入函式的所有結果。Lua 會確保傳回的值符合堆疊空間。函式結果會按直接順序推入堆疊(先推入第一個結果),以便在呼叫後,最後一個結果位於堆疊頂部。longjmp
)。a = f("how", t.x, 14)
lua_getfield(L, LUA_GLOBALSINDEX, "f"); // function to be called
lua_pushstring(L, "how"); // 1st argument
lua_getfield(L, LUA_GLOBALSINDEX, "t"); // table to be indexed
lua_getfield(L, -1, "x"); // push result of t.x (2nd arg)
lua_remove(L, -2); // remove 't' from the stack
lua_pushinteger(L, 14); // 3rd argument
lua_call(L, 3, 1); // call 'f' with 3 arguments and 1 result
lua_setfield(L, LUA_GLOBALSINDEX, "a"); // set global 'a'
lua_gettop(L)
(請參閱 lua_gettop())會傳回函式接收的引數數量。第一個引數(如果有的話)位於索引 1,而最後一個引數位於索引 lua_gettop(L)
。若要將值傳回 Lua,C 函式只需按直接順序(先推入第一個結果)將它們推入堆疊,然後傳回結果的數量。堆疊中低於結果的任何其他值都會被 Lua 正確丟棄。像 Lua 函式一樣,Lua 呼叫的 C 函式也可以傳回多個結果。static int foo (lua_State *L) {
int n = lua_gettop(L); /* number of arguments */
lua_Number sum = 0;
int i;
for (i = 1; i <= n; i++) {
if (!lua_isnumber(L, i)) {
lua_pushstring(L, "incorrect argument");
lua_error(L);
}
sum += lua_tonumber(L, i);
}
lua_pushnumber(L, sum/n); /* first result */
lua_pushnumber(L, sum); /* second result */
return 2; /* number of results */
}
extra
個可用的堆疊插槽。如果它無法將堆疊擴展到該大小,則會傳回 false。此函式永遠不會縮小堆疊;如果堆疊已經大於新大小,則它會保持不變。n
個值串接起來,並將這些值彈出堆疊,然後將結果留在頂端。如果 n
為 1,則結果是堆疊上的單一字串(也就是說,此函數不執行任何操作);如果 n
為 0,則結果為空字串。串接會遵循 Lua 的一般語義進行(請參閱 lua-concat)。func
。func
的堆疊中一開始只有一個元素,即包含 ud
的輕型使用者資料。如果發生錯誤,lua_cpcall
會傳回與 lua_pcall
相同的錯誤碼(請參閱 lua_pcall()),並將錯誤物件放在堆疊頂端;否則,它會傳回零,且不會變更堆疊。func
傳回的所有值都會被捨棄。narr
個陣列元素和 nrec
個非陣列元素。當您確切知道表格會有多少元素時,這種預先配置會很有用。否則,您可以使用函數 lua_newtable
(請參閱 lua_newtable())。lua_dump
會使用給定的 data
呼叫函數 writer
(請參閱 lua_Writer)來寫入它們。index1
和 index2
中的兩個值相等,則傳回 1,遵循 Lua ==
運算子的語義(也就是說,可能會呼叫元方法)。否則傳回 0。如果任何索引無效,也會傳回 0。what
的值執行數項工作LUA_GCSTOP
停止垃圾收集器。LUA_GCRESTART
重新啟動垃圾收集器。LUA_GCCOLLECT
執行完整的垃圾收集週期。LUA_GCCOUNT
傳回 Lua 目前使用的記憶體量(以 K 位元組為單位)。LUA_GCCOUNTB
傳回 Lua 目前使用的記憶體位元組數除以 1024 的餘數。LUA_GCSTEP
執行垃圾收集的增量步驟。步驟「大小」由 data
控制(較大的值表示較多的步驟),其方式未指定。如果您想要控制步驟大小,則必須以實驗方式調整 data
的值。如果步驟完成垃圾收集週期,則函數會傳回 1。name
的值推入堆疊。它定義為巨集#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, s)
t[k]
推入堆疊,其中 t
是給定有效索引 index
處的值,而 k
是堆疊頂端的值。ptrdiff_t
,這通常是機器「舒適」處理的最大整數類型。nil
,則傳回 1,否則傳回 0。index1
處的值小於可接受索引 index2
處的值,則傳回 1,遵循 Lua <
運算子的語義(也就是說,可能會呼叫元方法)。否則傳回 0。如果任何索引無效,也會傳回 0。int lua_load (lua_State *L,
lua_Reader reader,
void *data,
const char *chunkname);
lua_load
會將編譯的區塊做為 Lua 函數推入堆疊頂端。否則,它會推入錯誤訊息。lua_load
的傳回值如下0
:沒有錯誤;LUA_ERRSYNTAX
:預先編譯期間的語法錯誤;LUA_ERRMEM
:記憶體配置錯誤。lua_load
會自動偵測區塊是文字還是二進位,並據此載入(請參閱程式 luac
)。chunkname
引數會為區塊提供名稱,該名稱用於錯誤訊息和偵錯資訊中(請參閱 lua-apiDebug)。NULL
。引數 f
是配置器函數;Lua 會透過此函數執行此狀態的所有記憶體配置。第二個引數 ud
是不透明指標,Lua 只會在每次呼叫時將其傳遞給配置器。lua_createtable(L, 0, 0)
(請參閱 lua_createtable())。lua_State
(請參閱 lua_State)的指標,該指標代表此新的執行緒。此函式回傳的新狀態與原始狀態共享所有全域物件(例如表格),但具有獨立的執行堆疊。gc
元方法的完整 userdata 時,Lua 會呼叫元方法並將 userdata 標記為已完成。當此 userdata 再次被回收時,Lua 會釋放其對應的記憶體。lua_next
會回傳 0(且不推入任何內容)。/* table is in the stack at index 't' */
lua_pushnil(L); /* first key */
while (lua_next(L, t) != 0) {
/* uses 'key' (at index -2) and 'value' (at index -1) */
printf("%s - %s\n",
lua_typename(L, lua_type(L, -2)),
lua_typename(L, lua_type(L, -1)));
/* removes 'value'; keeps 'key' for next iteration */
lua_pop(L, 1);
}
lua_tolstring
(請參閱 lua_tolstring()),除非您知道該鍵實際上是一個字串。請回想一下,lua_tolstring
會變更
給定索引處的值;這會混淆對 lua_next
的下一次呼叫。luaconf.h
中變更。#
) 的結果;對於 userdata,這是為 userdata 配置的記憶體區塊大小;對於其他值,則為 0。nargs
和 nresults
的含義與 lua_call
(請參閱 lua_call())中的含義相同。如果在呼叫期間沒有錯誤,則 lua_pcall
的行為與 lua_call
完全相同。但是,如果有任何錯誤,lua_pcall
會捕獲它,在堆疊上推入一個值(錯誤訊息),並回傳一個錯誤碼。與 lua_call
一樣,lua_pcall
總是會從堆疊中移除函式及其引數。errfunc
為 0,則堆疊上回傳的錯誤訊息與原始錯誤訊息完全相同。否則,errfunc
是 錯誤
處理函式
的堆疊索引。(在目前的實作中,此索引不能是虛擬索引。)在發生執行階段錯誤時,將使用錯誤訊息呼叫此函式,並且其回傳值將是 lua_pcall
在堆疊上回傳的訊息。lua_pcall
回傳後,堆疊已解除,因此無法收集此類資訊。lua_pcall
函式在成功時回傳 0,或回傳以下錯誤碼之一(在 lua.h
中定義)LUA_ERRRUN
執行階段錯誤。LUA_ERRMEM
記憶體配置錯誤。對於此類錯誤,Lua 不會呼叫錯誤處理函式。LUA_ERRERR
執行錯誤處理函式時發生錯誤。n
個元素。b
的布林值推入堆疊。lua_pushcclosure
以建立 C 函式並將其推入堆疊,參數 n
會告知應與該函式關聯多少個值。lua_pushcclosure
也會從堆疊中彈出這些值。function
的 Lua 值推入堆疊,當呼叫該值時,將會調用對應的 C 函式。lua_pushcfunction
定義為巨集#define lua_pushcfunction(L,f) lua_pushcclosure(L,f,0)
sprintf
,但有一些重要的差異%%
(在字串中插入 %
)、%s
(插入以 null 終止的字串,沒有大小限制)、%f
(插入 lua_Number
)、%p
(以十六進位數字插入指標)、%d
(插入 int
)和 %c
(將 int
作為字元插入)。n
的數字推入堆疊。s
指向的、大小為 len
的字串推入堆疊。Lua 會建立(或重複使用)給定字串的內部副本,因此在函式回傳後,可以立即釋放或重複使用 s
處的記憶體。字串可以包含嵌入的零。n
的數字推入堆疊。s
指向的、以 null 結尾的字串推入堆疊。Lua 會建立(或重複使用)給定字串的內部副本,因此在函式回傳後,可以立即釋放或重複使用 s
處的記憶體。字串不能包含嵌入的零;假設它在第一個零處結束。L
代表的執行緒推入堆疊。如果此執行緒是其狀態的主要執行緒,則回傳 1。const char *lua_pushvfstring (lua_State *L,
const char *fmt,
va_list argp);
index1
和 index2
中的兩個值在原始意義上相等(即,不呼叫元方法),則回傳 1。否則回傳 0。如果任何索引無效,也回傳 0。lua_gettable
(請參閱 lua_gettable())類似,但會執行原始存取(即,不使用元方法)。t[n]
推入堆疊,其中 t
是給定有效索引 index
處的值。存取是原始存取;也就是說,它不會調用元方法。lua_settable
(請參閱 lua_settable())類似,但會執行原始指派(即,不使用元方法)。t[n] = v
的操作,其中 t
是給定有效索引 index
處的值,而 v
是堆疊頂端的值。lua_load
(請參閱 lua_load())使用的讀取器函式。每當需要區塊的另一部分時,lua_load
會呼叫讀取器,並傳遞其 data
參數。讀取器必須回傳一個指向具有區塊新部分的記憶體區塊的指標,並將 size
設定為區塊大小。該區塊必須存在,直到再次呼叫讀取器函式為止。若要發出區塊結束的訊號,讀取器必須回傳 NULL
。讀取器函式可以回傳任何大小大於零的部分。f
設定為全域 name
的新值。它定義為巨集#define lua_register(L,n,f) \
(lua_pushcfunction(L, f), lua_setglobal(L, n))
narg
呼叫 lua_resume
(請參閱 lua_resume())。當協程暫停或完成執行時,此呼叫會返回。當它返回時,堆疊會包含所有傳遞給 lua_yield
(請參閱 lua_yield()) 的值,或主體函數返回的所有值。如果協程暫停,lua_resume
會返回 LUA_YIELD
;如果協程在沒有錯誤的情況下完成執行,則返回 0;如果發生錯誤,則返回錯誤代碼 (請參閱 lua_pcall())。發生錯誤時,堆疊不會回溯,因此您可以在其上使用除錯 API。錯誤訊息位於堆疊頂端。若要重新啟動協程,您只需將要作為 lua_yield
結果傳遞的值放入其堆疊中,然後呼叫 lua_resume
。ud
的 f
。lua_setfenv
會返回 0。否則,它會返回 1。t[k] = v
,其中 t
是指定有效索引 index
處的值,而 v
是堆疊頂端的值。name
的新值。它被定義為巨集#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, s)
t[k] = v
,其中 t
是指定有效索引 index
處的值,v
是堆疊頂端的值,而 k
是緊接在頂端下方的值。nil
填滿。如果 index
為 0,則會移除所有堆疊元素。lua_newstate
(請參閱 lua_newstate()) 之外,後者會從頭開始建立 Lua 狀態。L
的狀態。LUA_YIELD
。lua_toboolean
對於任何不同於 false
和 nil
的 Lua 值都會返回 1;否則,它會返回 0。當使用無效的索引呼叫時,它也會返回 0。(如果您只想接受實際的布林值,請使用 lua_isboolean
lua_isboolean() 來測試值的類型。)NULL
。lua_Integer
(請參閱 lua_Integer)。Lua 值必須是數字或可轉換為數字的字串 (請參閱 lua-coercion);否則,lua_tointeger
會返回 0。len
不是 NULL
,它還會將 *len
設定為字串長度。Lua 值必須是字串或數字;否則,該函數會返回 NULL
。如果值是數字,則 lua_tolstring
也會將堆疊中的實際值變更為字串
。(當 lua_tolstring
在表格遍歷期間應用於鍵時,此變更會使 lua_next
lua_next() 感到困惑。)lua_tolstring
會返回指向 Lua 狀態內字串的完全對齊的指標。此字串在最後一個字元之後 (如在 C 中) 總是會有一個零 (\0
),但在其主體中可能包含其他零。由於 Lua 具有垃圾回收功能,因此無法保證在從堆疊中移除相應的值後,lua_tolstring
返回的指標仍然有效。lua_Number
(請參閱 lua_Number)。Lua 值必須是數字或可轉換為數字的字串 (請參閱 lua-coercion);否則,lua_tonumber
會返回 0。void*
)。該值可以是使用者資料、表格、執行緒或函數;否則,lua_topointer
會返回 NULL
。不同的物件會提供不同的指標。沒有辦法將指標轉換回其原始值。NULL
。LUA_TNONE
。lua_type
返回的類型由 lua.h
中定義的以下常數編碼:LUA_TNIL
、LUA_TNUMBER
、LUA_TBOOLEAN
、LUA_TSTRING
、LUA_TTABLE
、LUA_TFUNCTION
、LUA_TUSERDATA
、LUA_TTHREAD
和 LUA_TLIGHTUSERDATA
。tp
編碼的類型名稱,該值必須是 lua_type
返回的值之一。lua_dump
(請參閱 lua_dump()) 使用的寫入器函數。每當它產生另一塊區塊時,lua_dump
會呼叫寫入器,並傳遞要寫入的緩衝區 (p
)、其大小 (sz
) 和提供給 lua_dump
的 data
參數。lua_dump
再次呼叫寫入器。相同
全域狀態的不同執行緒之間交換值。from
中彈出 n
個值,並將它們推送到堆疊 to
上。return lua_yield (L, nresults);
lua_yield
時,正在執行的協程會暫停執行,並且啟動此協程的 lua_resume
(請參閱 lua_resume()) 呼叫會返回。參數 nresults
是從堆疊傳遞為 lua_resume
結果的值數量。10 20 30 40 50*
(從底部到頂部;*
標記頂部),則lua_pushvalue(L, 3) --> 10 20 30 40 50 30* lua_pushvalue(L, -1) --> 10 20 30 40 50 30 30* lua_remove(L, -3) --> 10 20 30 40 30 30* lua_remove(L, 6) --> 10 20 30 40 30* lua_insert(L, 1) --> 30 10 20 30 40* lua_insert(L, -1) --> 30 10 20 30 40* (no effect) lua_replace(L, 2) --> 30 40 20 30* lua_settop(L, -3) --> 30 40* lua_settop(L, 6) --> 30 40 nil nil nil nil*
typedef struct lua_Debug {
int event;
const char *name; /* (n) */
const char *namewhat; /* (n) */
const char *what; /* (S) */
const char *source; /* (S) */
int currentline; /* (l) */
int nups; /* (u) number of upvalues */
int linedefined; /* (S) */
int lastlinedefined; /* (S) */
char short_src[LUA_IDSIZE]; /* (S) */
/* private part */
other fields
} lua_Debug;
lua_getstack
(請參閱 lua_getstack()) 僅填入此結構的私人部分,以供稍後使用。若要使用有用的資訊填寫 lua_Debug
的其他欄位,請呼叫 lua_getinfo
(請參閱 lua_getinfo())。lua_Debug
的欄位具有以下含義source
如果函數是在字串中定義的,則 source
是該字串。如果函數是在檔案中定義的,則 source
會以 @
開頭,後接檔案名稱。short_src
source
的「可列印」版本,用於錯誤訊息中。linedefined
函數定義開始所在的行號。lastlinedefined
函數定義結束所在的行號。what
如果函數是 Lua 函數,則為字串 "Lua"
;如果是 C 函數,則為 "C"
;如果是區塊的主要部分,則為 "main"
;如果是執行尾部呼叫的函數,則為 "tail"
。在後一種情況下,Lua 沒有關於該函數的其他資訊。currentline
給定函數正在執行的目前行。當沒有可用的行資訊時,currentline
會設定為 -1。name
給定函式的合理名稱。因為 Lua 中的函式是一等值,它們沒有固定的名稱:有些函式可能是多個全域變數的值,而另一些函式可能只儲存在表格欄位中。lua_getinfo
函式會檢查函式是如何被呼叫的,以找到合適的名稱。如果找不到名稱,則 name
會被設為 NULL
。namewhat
解釋 name
欄位。根據函式的呼叫方式,namewhat
的值可以是 "global"
、"local"
、"method"
、"field"
、"upvalue"
或 ""
(空字串)。(當沒有其他選項適用時,Lua 會使用空字串。) nups
函式的上值數量。ar
必須是有效的活動記錄,該記錄是先前呼叫 lua_getstack
(請參閱 lua_getstack()) 或作為引數提供給鉤子 (請參閱 lua_Hook) 所填寫的。>
開始 what
字串。(在這種情況下,lua_getinfo
會彈出堆疊頂端的函式。) 例如,要得知函式 f
在哪一行定義的,您可以編寫以下程式碼lua_Debug ar;
lua_getfield(L, LUA_GLOBALSINDEX, "f"); /* get global 'f' */
lua_getinfo(L, ">S", &ar);
printf("%d\n", ar.linedefined);
what
中的每個字元都會選擇要填寫的結構 ar
的某些欄位,或要推入堆疊的值'n'
填寫欄位 name
和 namewhat
'S'
填寫欄位 source
、short_src
、linedefined
、lastlinedefined
和 what
'l'
填寫欄位 currentline
'u'
填寫欄位 nups
'f'
將給定層級正在執行的函式推入堆疊 'L'
將一個表格推入堆疊,該表格的索引是函式中有效的行號。(有效行
是具有某些相關程式碼的行,也就是您可以放置中斷點的行。無效行包括空行和註解。)what
中有無效的選項)。ar
必須是有效的活動記錄,該記錄是先前呼叫 lua_getstack
(請參閱 lua_getstack()) 或作為引數提供給鉤子 (請參閱 lua_Hook) 所填寫的。索引 n
會選擇要檢查哪個區域變數 (1 是第一個參數或活動的區域變數,依此類推,直到最後一個活動的區域變數)。lua_getlocal
將變數的值推入堆疊並返回其名稱。(
(左括號) 開頭的變數名稱表示內部變數 (迴圈控制變數、暫時變數和 C 函式區域變數)。NULL
(且不推入任何內容)。活動記錄
的識別填寫 lua_Debug
(請參閱 lua_Debug) 結構的部分。層級 0 是目前正在執行的函式,而層級 n+1
是呼叫層級 n
的函式。當沒有錯誤時,lua_getstack
會返回 1;當呼叫的層級大於堆疊深度時,則返回 0。lua_getupvalue
取得上值的索引 n
、將上值的值推入堆疊,並返回其名稱。funcindex
指向堆疊中的閉包。(上值沒有特定的順序,因為它們在整個函式中都是活動的。因此,它們會以任意順序編號。)NULL
(且不推入任何內容)。對於 C 函式,此函式會使用空字串 ""
作為所有上值的名稱。ar
引數的 event
欄位會設定為觸發鉤子的特定事件。Lua 使用以下常數識別這些事件:LUA_HOOKCALL
、LUA_HOOKRET
、LUA_HOOKTAILRET
、LUA_HOOKLINE
和 LUA_HOOKCOUNT
。此外,對於行事件,也會設定 currentline
欄位。若要取得 ar
中任何其他欄位的值,鉤子必須呼叫 lua_getinfo
(請參閱 lua_getinfo())。對於返回事件,event
可以是 LUA_HOOKRET
(正常值) 或 LUA_HOOKTAILRET
。在後一種情況下,Lua 正在模擬從執行尾呼叫的函式返回;在這種情況下,呼叫 lua_getinfo
是沒有意義的。f
是鉤子函式。mask
指定將在哪些事件上呼叫鉤子:它由常數 LUA_MASKCALL
、LUA_MASKRET
、LUA_MASKLINE
和 LUA_MASKCOUNT
的位元邏輯 or
形成。僅當遮罩包含 LUA_MASKCOUNT
時,count
引數才有意義。對於每個事件,都會如下所述呼叫鉤子呼叫鉤子
:在直譯器呼叫函式時呼叫。在 Lua 進入新函式之後、函式取得其引數之前呼叫鉤子。返回鉤子
:在直譯器從函式返回時呼叫。在 Lua 離開函式之前呼叫鉤子。您無法存取函式要返回的值。行鉤子
:在直譯器即將開始執行新的程式碼行,或在程式碼中跳回 (即使跳到同一行) 時呼叫。(此事件僅在 Lua 執行 Lua 函式時發生。)計數鉤子
:在直譯器執行每 count
個指令後呼叫。(此事件僅在 Lua 執行 Lua 函式時發生。)mask
設定為零來停用鉤子。ar
和 n
與 lua_getlocal
中的相同 (請參閱 lua_getlocal())。lua_setlocal
將堆疊頂部的值指派給變數,並返回其名稱。它也會從堆疊中彈出值。NULL
(且不彈出任何內容)。funcindex
和 n
與 lua_getupvalue
中的相同 (請參閱 lua_getupvalue())。NULL
(且不彈出任何內容)。int listvars (lua_State *L, int level) {
lua_Debug ar;
int i;
const char *name;
if (lua_getstack(L, level, &ar) == 0)
return 0; /* failure: no such level in the stack */
i = 1;
while ((name = lua_getlocal(L, &ar, i++)) != NULL) {
printf("local %d %s\n", i-1, name);
lua_pop(L, 1); /* remove variable value */
}
lua_getinfo(L, "f", &ar); /* retrieves function */
i = 1;
while ((name = lua_getupvalue(L, -1, i++)) != NULL) {
printf("upvalue %d %s\n", i-1, name);
lua_pop(L, 1); /* remove upvalue value */
}
return 1;
}
lauxlib.h
中定義,並具有前置詞 luaL_
。luaL_check*
或 luaL_opt*
。如果檢查不符合條件,所有這些函式都會引發錯誤。由於錯誤訊息是針對引數格式化的 (例如,「錯誤引數 #1」),因此您不應將這些函式用於其他堆疊值。B
(請參閱 luaL_Buffer)。並將該值從堆疊中彈出。void luaL_argcheck (lua_State *L,
int cond,
int narg,
const char *extramsg);
cond
是否為真。若否,則會引發錯誤,錯誤訊息如下,其中 func
是從呼叫堆疊中取得的bad argument #<narg> to <func> (<extramsg>)
func
是從呼叫堆疊中取得的bad argument #<narg> to <func> (<extramsg>)
return luaL_argerror(
args
)
。字串緩衝區
的類型。luaL_Buffer
類型的變數 b
。luaL_buffinit(L, &b)
初始化它 (請參閱 luaL_buffinit())。luaL_add*
函式,將字串片段加入緩衝區。luaL_pushresult(&b)
(請參閱 luaL_pushresult())。此呼叫會將最終字串留在堆疊頂端。luaL_addvalue
luaL_addvalue()。) 呼叫 luaL_pushresult
後,堆疊會回到緩衝區初始化時的層級,再加上頂端的最終字串。B
。此函式不配置任何空間;緩衝區必須宣告為變數 (請參閱 luaL_Buffer)。obj
的物件具有元表,且此元表具有欄位 e
,則此函式會呼叫此欄位,並將物件作為其唯一引數傳遞。在此情況下,此函式會返回 1,並將呼叫返回的值推入堆疊。如果沒有元表或沒有元方法,則此函式會返回 0 (而不在堆疊上推入任何值)。narg
是否具有任何類型的引數 (包括 nil
)。narg
是否為數字,並返回此數字轉換為 int
的結果。narg
是否為數字,並返回此數字轉換為 long
的結果。const char *luaL_checklstring (lua_State *L, int narg, size_t *l);
narg
是否為字串,並返回此字串;如果 l
不是 NULL
,則以字串的長度填入 *l
。narg
是否為數字,並返回此數字 (請參閱 lua_Number)。int luaL_checkoption (lua_State *L,
int narg,
const char *def,
const char *const lst[]);
narg
是否為字串,並在陣列 lst
中搜尋此字串 (該陣列必須以 NULL 結尾)。返回在陣列中找到字串的索引。如果引數不是字串或找不到字串,則會引發錯誤。def
不是 NULL
,則當沒有引數 narg
或此引數為 nil
時,函式會使用 def
作為預設值。top + sz
個元素,如果堆疊無法擴展到該大小,則會引發錯誤。msg
是要加入錯誤訊息中的額外文字。narg
是否為字串,並返回此字串。void *luaL_checkudata (lua_State *L, int narg, const char *tname);
(luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
(luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
fmt
加上任何額外引數給定,遵循與 lua_pushfstring
相同的規則 (請參閱 lua_pushfstring())。如果此資訊可用,它也會在訊息開頭加入發生錯誤的檔案名稱和行號。return luaL_error(
args
)
。obj
的物件的元表中的欄位 e
推入堆疊。如果物件沒有元表,或者元表沒有此欄位,則會返回 0 且不推入任何內容。tname
相關聯的元表推入堆疊 (請參閱 luaL_newmetatable())。const char *luaL_gsub (lua_State *L,
const char *s,
const char *p,
const char *r);
s
的副本,方法是將字串 p
的任何出現次數取代為字串 r
。將結果字串推入堆疊並返回它。int luaL_loadbuffer (lua_State *L,
const char *buff,
size_t sz,
const char *name);
lua_load
相同的結果。name
是區塊名稱,用於除錯資訊和錯誤訊息。lua_load
(請參閱 lua_load()) 來載入名為 filename
的檔案中的區塊。如果 filename
為 NULL
,則從標準輸入載入。如果檔案中的第一行以 #
開頭,則會忽略該行。lua_load
相同的結果,但如果無法開啟/讀取檔案,則會有額外的錯誤碼 LUA_ERRFILE
。lua_load
一樣,此函式只載入區塊;它不會執行區塊。lua_load
相同的結果。lua_load
一樣,此函式只載入區塊;它不會執行區塊。tname
,則返回 0。否則,會建立一個新的表格以用作 userdata 的元表,並將其以索引鍵 tname
加入登錄表,並返回 1。tname
相關聯的最終值推入堆疊。realloc
函式的配置器呼叫 lua_newstate
(請參閱 lua_newstate()),然後設定一個 panic 函式 (請參閱 lua_atpanic()),以便在發生嚴重錯誤時將錯誤訊息列印到標準錯誤輸出。NULL
。narg
為數字,則返回此數字轉換為 int
的結果。如果此引數不存在或為 nil
,則返回 d
。否則,會引發錯誤。lua_Integer luaL_optinteger (lua_State *L,
int narg,
lua_Integer d);
narg
是一個數字,則會回傳轉換為 long
的該數字。如果此參數不存在或為 nil
,則會回傳 d
。否則,會引發錯誤。const char *luaL_optlstring (lua_State *L,
int narg,
const char *d,
size_t *l);
narg
是一個字串,則會回傳此字串。如果此參數不存在或為 nil
,則會回傳 d
。否則,會引發錯誤。l
不是 NULL
,則會將結果的長度填入 *l
的位置。narg
是一個數字,則會回傳此數字。如果此參數不存在或為 nil
,則會回傳 d
。否則,會引發錯誤。narg
是一個字串,則會回傳此字串。如果此參數不存在或為 nil
,則會回傳 d
。否則,會引發錯誤。LUAL_BUFFERSIZE
的空間位址,您可以在此複製要新增到緩衝區 B
的字串 (參見 luaL_Buffer)。將字串複製到此空間後,您必須呼叫 luaL_addsize
(參見 luaL_addsize()) 並傳入字串的大小,才能實際將字串新增到緩衝區。B
的使用,並將最終字串留在堆疊頂端。t
的表格中,為堆疊頂端的物件建立並回傳一個 reference
(並將該物件彈出堆疊)。t
中,luaL_ref
就會確保其回傳的索引鍵的唯一性。您可以透過呼叫 lua_rawgeti(L, t, r)
(參見 lua_rawgeti()) 來擷取參考 r
所指的物件。函式 luaL_unref
(參見 luaL_unref()) 會釋放參考及其相關聯的物件。nil
,則 luaL_ref
會回傳常數 LUA_REFNIL
。常數 LUA_NOREF
保證與 luaL_ref
回傳的任何參考都不同。luaL_register
(參見 luaL_register()) 註冊的函數陣列的類型。name
是函數名稱,而 func
是指向該函數的指標。任何 luaL_Reg
陣列都必須以哨兵條目結尾,其中 name
和 func
均為 NULL
。void luaL_register (lua_State *L,
const char *libname,
const luaL_Reg *l);
libname
呼叫時,luaL_register
會建立一個新的表格 t
,將其設定為全域變數 libname
的值,將其設定為 package.loaded[libname]
的值,並將列表 l
中的所有函數註冊到其中。如果 package.loaded[libname]
或變數 libname
中有表格,則會重複使用此表格,而不是建立新的表格。idx
處的值的類型名稱。location
: 不良參數
narg
給
'func'
(
tname
預期,得到
rt
)
ref
為 LUA_NOREF
或 LUA_REFNIL
,則 luaL_unref
不會執行任何動作。lvl
處的控制項目前位置。此字串通常具有下列格式:chunkname:currentline
type
和 getmetatable
);其他函數提供對「外部」服務的存取權 (例如,I/O);而其他函數則可以在 Lua 本身中實作,但相當實用或具有關鍵的效能需求,因此值得在 C 中實作 (例如,sort
)。luaL_openlibs
函數,以開啟所有標準程式庫 (參見 luaL_openlibs())。或者,主機程式可以個別開啟程式庫,方法是呼叫 luaopen_base
(用於基本程式庫)、luaopen_package
(用於套件程式庫)、luaopen_string
(用於字串程式庫)、luaopen_table
(用於表格程式庫)、luaopen_math
(用於數學程式庫)、luaopen_io
(用於 I/O 和作業系統程式庫) 和 luaopen_debug
(用於偵錯程式庫)。這些函數在 lualib.h
中宣告,且不應直接呼叫:您必須像任何其他 Lua C 函數一樣呼叫它們,例如,透過使用 lua_call
(參見 lua_call())。{v}
[, {message}
]) assert()v
的值為 false (即 nil
或 false
) 時,會發出錯誤訊息;否則,會回傳其所有參數。message
是錯誤訊息;如果不存在,則預設為「assertion failed!」。"stop"
停止垃圾收集器。"restart"
重新啟動垃圾收集器。"collect"
執行完整的垃圾收集週期。"count"
回傳 Lua 使用的總記憶體 (以 Kbytes 為單位)。"step"
執行垃圾收集步驟。步驟「大小」由 {arg}
控制 (較大的值表示更多步驟),但方式未指定。如果您想要控制步驟大小,則必須以實驗方式調整 {arg}
的值。如果步驟完成收集週期,則會回傳 true
。"setpause"
將 {arg}
/100 設定為收集器 pause
的新值 (參見 lua-gc)。"setstepmul"
將 {arg}
/100 設定為收集器 `step multiplier` 的新值 (參見 lua-gc)。{filename}
) dofile()dofile
會執行標準輸入 (stdin
) 的內容。回傳程式碼區塊回傳的所有值。如果發生錯誤,dofile
會將錯誤傳播到其呼叫者 (亦即,dofile
不會在受保護模式下執行)。{error}
會在訊息開頭新增一些關於錯誤位置的資訊。{level}
參數會指定如何取得錯誤位置。使用層級 1 (預設值),錯誤位置是呼叫 {error}
函數的位置。層級 2 會將錯誤指向呼叫 {error}
的函數的呼叫位置;依此類推。傳遞層級 0 可避免將錯誤位置資訊新增到訊息中。{f}
) getfenv(){f}
可以是 Lua 函數或指定該堆疊層級函數的數字:層級 1 是呼叫 getfenv
的函數。如果給定的函數不是 Lua 函數,或者如果 {f}
為 0,則 getfenv
會回傳全域環境。{f}
的預設值為 1。{object}
) getmetatable(){object}
沒有元表,則會回傳 nil
。否則,如果物件的元表具有 "__metatable"
欄位,則會回傳相關聯的值。否則,會回傳給定物件的元表。for i,v in ipairs(t) do
body
end
1,t[1]
), (2,t[2]
), ..., 直到表格中第一個不存在的整數鍵。{func}
[, {chunkname}
]) load(){func}
來載入程式碼區塊,以取得其片段。每次呼叫 {func}
都必須回傳一個字串,並與先前的結果串接。回傳 nil
(或沒有值)表示程式碼區塊的結束。nil
加上錯誤訊息。回傳函式的環境為全域環境。{chunkname}
用於錯誤訊息和偵錯資訊中的程式碼區塊名稱。assert(loadstring(s))()
{table}
[, {index}
]) next()next
會回傳表格的下一個索引及其關聯的值。當以 nil
作為第二個參數呼叫時,next
會回傳初始索引及其關聯的值。當以最後一個索引呼叫,或在空表格中以 nil
呼叫時,next
會回傳 nil
。如果第二個參數不存在,則會將其解讀為 nil
。特別地,您可以使用 next(t)
來檢查表格是否為空。for
或 ipairs() 函式。)next
的行為是未定義的
。但是,您可以修改現有的欄位。特別是,您可以清除現有的欄位。for k,v in pairs(t) do
body
end
{t}
的所有鍵值對。{f}
, {arg1}
, {...}
) pcall()保護模式
使用給定的引數呼叫函式 {f}
。這表示 {f}
內部的任何錯誤都不會傳播;相反地,pcall
會捕獲錯誤並回傳狀態碼。它的第一個結果是狀態碼 (布林值),如果呼叫成功且沒有錯誤,則為 true
。在這種情況下,pcall
也會在此第一個結果之後,回傳所有來自呼叫的結果。如果發生任何錯誤,pcall
會回傳 false
加上錯誤訊息。{...}
) print()tostring
tostring() 函式將其轉換為字串,然後將其值列印到 stdout
。print
不適用於格式化輸出,而僅適用於快速顯示數值,通常用於除錯。如需格式化輸出,請使用 string.format
(參見 string.format())。{table}
, {index}
, {value}
) rawset()table[index]
的實際值設定為 {value}
,而不呼叫任何元方法。{table}
必須是表格,{index}
可以是任何不是 nil
的值,而 {value}
可以是任何 Lua 值。{table}
。{index}
, {...}
) select(){index}
是數字,則回傳引數編號 {index}
之後的所有引數。否則,{index}
必須是字串 "#"
,而 select
會回傳它接收到的額外引數總數。{f}
, {table}
) setfenv(){f}
可以是 Lua 函式或指定該堆疊層級函式的數字:層級 1 是呼叫 setfenv
的函式。setfenv
回傳給定的函式。{f}
為 0 時,setfenv
會變更執行緒的環境。在這種情況下,setfenv
不回傳任何值。{table}
, {metatable}
) setmetatable(){metatable}
是 nil
,則會移除給定表格的元表格。如果原始的元表格具有 "__metatable"
欄位,則會引發錯誤。{table}
。A
(不論大小寫) 代表 10,B
代表 11,依此類推,Z'
代表 35。在 10 進位 (預設值) 中,數字可以有小數部分,以及可選的指數部分 (參見 lua-lexical)。在其他進位制中,僅接受無正負號的整數。{e}
) tostring()string.format
(參見 string.format())。{v}
) lua-type()"nil"
(字串,而非值 nil
)、"number"
、"string"
、"boolean
、"table"
、"function"
、"thread"
和 "userdata"
。xpcall
以保護模式呼叫函式 {f}
,並使用 {err}
作為錯誤處理常式。{f}
內部的任何錯誤都不會傳播;相反地,xpcall
會捕獲錯誤,以原始的錯誤物件呼叫 {err}
函式,並回傳狀態碼。它的第一個結果是狀態碼 (布林值),如果呼叫成功且沒有錯誤,則為 true。在這種情況下,xpcall
也會在此第一個結果之後,回傳所有來自呼叫的結果。如果發生任何錯誤,xpcall
會回傳 false
加上來自 {err}
的結果。coroutine
內。如需協同程式的一般說明,請參見 lua-coroutine。{f}
) coroutine.create(){f}
。{f}
必須是 Lua 函式。回傳這個新的協同程式,一個類型為 "thread"
的物件。{co}
[, {val1}
, {...}
]) coroutine.resume(){co}
。第一次恢復協同程式時,它會開始執行其主體。值 {val1}
, {...}
會作為引數傳遞給主體函式。如果協同程式已暫停,resume
會重新啟動它;值 {val1}
, {...}
會作為 yield 的結果傳遞。resume
會回傳 true
加上傳遞給 yield
的任何值 (如果協同程式暫停) 或主體函式回傳的任何值 (如果協同程式終止)。如果發生任何錯誤,resume
會回傳 false
加上錯誤訊息。{co}
) coroutine.status(){co}
的狀態:如果協程正在運行(即,它呼叫了 status
),則返回 "running"
;如果協程在呼叫 yield
時暫停,或者尚未開始運行,則返回 "suspended"
;如果協程處於活動狀態但未運行(即,它已恢復另一個協程),則返回 "normal"
;如果協程已完成其主體函數,或因錯誤而停止,則返回 "dead"
。{f}
) coroutine.wrap(){f}
。{f}
必須是一個 Lua 函數。返回一個函數,該函數每次被呼叫時都會恢復協程。傳遞給該函數的任何參數都如同傳遞給 resume
的額外參數。返回與 resume
返回的相同的值,除了第一個布林值。如果發生錯誤,則會傳播該錯誤。{...}
) coroutine.yield()yield
的任何參數都會作為額外結果傳遞給 resume
。require
和 module
(請參閱 require() 和 module())。其他所有內容都在表格 package
中匯出。{name}
[, {...}
]) module()package.loaded[name]
中有一個表格,則此表格就是模組。否則,如果存在一個具有給定名稱的全域表格 t
,則此表格就是模組。否則,創建一個新的表格 t
並將其設定為全域 {name}
的值和 package.loaded[name]
的值。此函數還使用給定的名稱初始化 t._NAME
,使用模組(t
本身)初始化 t._M
,並使用封裝名稱(完整模組名稱減去最後一個元件;請參閱下文)初始化 t._PACKAGE
。最後,module
將 t
設定為目前函數的新環境和 package.loaded[name]
的新值,以便 require() 返回 t
。{name}
是一個複合名稱(即,元件以點號分隔),則 module
會為每個元件創建(或重複使用,如果它們已存在)表格。例如,如果 {name}
是 a.b.c
,則 module
將模組表格儲存在全域 a
的欄位 b
的欄位 c
中。options
,其中每個選項都是一個要應用於模組的函數。{modname}
) require()package.loaded
表格,以確定 {modname}
是否已載入。如果是,則 require
返回儲存在 package.loaded[modname]
中的值。否則,它會嘗試尋找模組的 loader
。require
查詢 package.preload[modname]
。如果它有值,則此值(應該是一個函數)就是載入器。否則,require
會使用儲存在 package.path
中的路徑搜尋 Lua 載入器。如果也失敗了,它會使用儲存在 package.cpath
中的路徑搜尋 C 載入器。如果也失敗了,它會嘗試使用 all-in-one
載入器(請參閱下文)。require
首先使用動態連結工具將應用程式與函式庫連結。然後,它會嘗試在此函式庫中尋找一個 C 函數以用作載入器。此 C 函數的名稱是字串 "luaopen_"
,串聯上模組名稱的副本,其中每個點號都替換為底線。此外,如果模組名稱有連字號,則會移除其直到(包括)第一個連字號的前綴。例如,如果模組名稱是 a.v1-b.c
,則函數名稱將為 luaopen_b_c
。require
找不到模組的 Lua 函式庫或 C 函式庫,它會呼叫 all-in-one loader
。此載入器會搜尋 C 路徑以尋找給定模組的根名稱的函式庫。例如,當要求 a.b.c
時,它會搜尋 a
的 C 函式庫。如果找到,它會在其中尋找子模組的開啟函數;在我們的範例中,那將是 luaopen_a_b_c
。透過此工具,套件可以將多個 C 子模組封裝到一個函式庫中,每個子模組都保留其原始開啟函數。require
會使用單一引數 {modname}
呼叫載入器。如果載入器傳回任何值,則 require
會將傳回的值指派給 package.loaded[modname]
。如果載入器沒有傳回任何值,並且沒有將任何值指派給 package.loaded[modname]
,則 require
會將 true
指派給此項目。無論如何,require
都會傳回 package.loaded[modname]
的最終值。require
會發出錯誤訊號。LUA_CPATH
(加上 luaconf.h
中定義的另一個預設路徑)以與初始化 Lua 路徑 package.path
相同的方式初始化 C 路徑 package.cpath
。require
用於控制已載入哪些模組的表格。當您要求模組 modname
且 package.loaded[modname]
不為 false 時,require
只會傳回儲存在該處的值。{libname}
, {funcname}
) package.loadlib(){libname}
動態連結。在此函式庫中,尋找函數 {funcname}
並將此函數作為 C 函數傳回。(因此,{funcname}
必須遵循協定(請參閱 lua_CFunction))。require
不同,它不會執行任何路徑搜尋,也不會自動新增擴充功能。{libname}
必須是 C 函式庫的完整檔案名稱,包括必要時的路徑和擴充功能。{funcname}
必須是 C 函式庫匯出的確切名稱(可能取決於使用的 C 編譯器和連結器)。dlfcn
標準的 Unix 系統)。LUA_PATH
的值或 luaconf.h
中定義的預設路徑來初始化此變數。環境變數值中的任何 ";;"
都會被預設路徑取代。templates
序列。對於每個範本,require
會將範本中的每個問號變更為 filename
,它是 modname
,其中每個點號都替換為「目錄分隔符號」(例如 Unix 中的 "/"
);然後,它會嘗試載入產生的檔案名稱。因此,例如,如果 Lua 路徑是"./?.lua;./?.lc;/usr/local/?/init.lua"
foo
的 Lua 載入器搜尋將嘗試按該順序載入檔案 ./foo.lua
、./foo.lc
和 /usr/local/foo/init.lua
。{module}
) package.seeall()__index
欄位參照全域環境,為 {module}
設定一個元表格,以便此模組繼承全域環境中的值。用作函數 {module}
的選項。string
中提供所有函數。它還為字串設定一個元表格,其中 __index
欄位指向 string
表格。因此,您可以使用物件導向風格的字串函數。例如,string.byte(s, i)
可以寫成 s:byte(i)
。{s}
[, {i}
[, {j}
]]) string.byte()s[i]
、s[i+1]
,..., s[j]
的內部數值代碼。{i}
的預設值是 1;{j}
的預設值是 {i}
。{function}
) string.dump(){function}
必須是沒有上值的 Lua 函式。{s}
, {pattern}
[, {init}
[, {plain}
]]) string.find(){s}
中尋找 {pattern}
的第一個匹配項。如果找到匹配項,則 {find}
會傳回此匹配項在 {s}
中開始和結束的索引;否則,它會傳回 nil
。第三個可選數值引數 {init}
指定從哪裡開始搜尋;其預設值為 1,且可為負數。第四個可選引數 {plain}
的值為 {true}
時,會關閉樣式匹配功能,因此函式會執行純粹的「尋找子字串」操作,且 {pattern}
中的任何字元都不會被視為「魔術字元」。請注意,如果指定了 {plain}
,則也必須指定 {init}
。{formatstring}
, {...}
) string.format()printf
系列的相同規則。唯一的區別在於不支援選項/修飾符 *
、l
、L
、n
、p
和 h
,並且有一個額外的選項 q
。 q
選項會以適合 Lua 直譯器安全讀回的形式格式化字串:字串會寫在雙引號之間,並且字串中的所有雙引號、換行符、內嵌的零和反斜線在寫入時都會正確逸出。例如,呼叫string.format('%q', 'a string with "quotes" and \n new line')
"a string with \"quotes\" and \
new line"
c
、d
、E
、e
、f
、g
、G
、i
、o
、u
、X
和 x
都需要一個數字作為引數,而 q
和 s
則需要一個字串。{pattern}
未指定任何捕獲,則每次呼叫都會產生整個匹配項。s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
print(w)
end
{s}
中的所有單字,並在每行中列印一個單字。下一個範例將給定字串中的所有 key=value
對收集到一個表格中t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%w+)=(%w+)") do
t[k] = v
end
{s}
, {pattern}
, {repl}
[, {n}
]) string.gsub(){s}
的副本,其中所有 {pattern}
的出現次數都已替換為 {repl}
指定的替換字串,該字串可以是字串、表格或函式。 gsub
也會傳回它作為第二個值所做的替換總數。{repl}
是字串,則其值會用於替換。字元 %
會作為逸出字元:{repl}
中任何形式為 %n
的序列(其中 {n}
介於 1 和 9 之間),都代表第 {n}
個捕獲的子字串的值(請參閱下文)。序列 %0
代表整個匹配項。序列 %%
代表單個 %
。{repl}
是表格,則會針對每次匹配查詢該表格,並將第一個捕獲用作索引鍵;如果樣式未指定任何捕獲,則整個匹配項會用作索引鍵。{repl}
是函式,則每次發生匹配時都會呼叫此函式,並將所有捕獲的子字串依序傳遞為引數;如果樣式未指定任何捕獲,則會將整個匹配項作為單一引數傳遞。false
或 nil
,則不會進行替換(也就是說,原始匹配項會保留在字串中)。{n}
會限制發生的最大替換次數。例如,當 {n}
為 1 時,只會替換 pattern
的第一個出現次數。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 loadstring(s)()
end)
--> x="4+5 = 9"
local t = {name="lua", version="5.1"}
x = string.gsub("$name%-$version.tar.gz", "%$(%w+)", t)
--> x="lua-5.1.tar.gz"
{s}
, {pattern}
[, {init}
]) string.match(){s}
中尋找 {pattern}
的第一個 match
。如果找到一個,則 match
會傳回樣式的捕獲;否則,它會傳回 nil
。如果 {pattern}
未指定任何捕獲,則會傳回整個匹配項。第三個可選數值引數 {init}
指定從哪裡開始搜尋;其預設值為 1,且可為負數。{s}
, {i}
[, {j}
]) string.sub(){s}
的子字串,該子字串從 {i}
開始,並持續到 {j}
;{i}
和 {j}
可以是負數。如果 {j}
不存在,則會假定其等於 -1
(與字串長度相同)。特別是,呼叫 string.sub(s,1,j)
會傳回長度為 {j}
的 {s}
的前綴,而 string.sub(s,-i)
會傳回長度為 {i}
的 {s}
的後綴。x
(其中 x
不是魔術字元 ^$()%.[]*+-?
之一)表示字元 x
本身。.
(點)表示所有字元。%a
表示所有字母。%c
表示所有控制字元。%d
表示所有數字。%l
表示所有小寫字母。%p
表示所有標點符號字元。%s
表示所有空格字元。%u
表示所有大寫字母。%w
表示所有字母數字字元。%x
表示所有十六進位數字。%z
表示表示法為 0
的字元。%x
(其中 x
是任何非字母數字字元)表示字元 x
。這是逸出魔術字元的標準方式。任何標點符號字元(甚至是沒有魔術的字元)在用於表示模式中的字元本身時,前面都可以加上 %
。[set]
表示類別,它是 set
中所有字元的聯集。可以使用 -
分隔範圍的結束字元,以指定字元範圍。上述描述的所有類別 %x
也可以用作 set
中的元件。 set
中的所有其他字元都代表它們自己。例如,[%w_]
(或 [_%w]
)表示所有字母數字字元加上底線,[0-7]
表示八進位數字,而 [0-7%l%-]
表示八進位數字加上小寫字母加上 -
字元。[%a-z]
或 [a-%%]
之類的樣式沒有意義。[^set]
表示 set
的補集,其中 set
的解讀方式如上所述。%a
、%c
等),對應的大寫字母表示該類別的補集。例如,%S
表示所有非空格字元。[a-z]
可能不等於 %l
。*
的單個字元類別,符合類別中字元的 0 個或多個重複。這些重複項目將始終符合可能的最長序列;+
的單個字元類別,符合類別中字元的 1 個或多個重複。這些重複項目將始終符合可能的最長序列;-
的單個字元類別,也符合類別中字元的 0 個或多個重複。與 *
不同,這些重複項目將始終符合可能的最短序列;?
的單個字元類別,符合類別中字元的 0 個或 1 個出現次數;%n
,其中 n
介於 1 到 9 之間;此項目會匹配與第 n
個捕獲字串相等的子字串(請參閱下文);%bxy
,其中 x
和 y
是兩個不同的字元;此項目會匹配以 x
開頭、以 y
結尾,且 x
和 y
是平衡的字串。這表示,如果從左到右讀取字串,x
記為 +1
,y
記為 -1
,則結尾的 y
是計數達到 0 的第一個 y
。例如,項目 %b()
會匹配具有平衡括號的表達式。^
會將匹配錨定在主體字串的開頭。模式結尾的 $
會將匹配錨定在主體字串的結尾。在其他位置,^
和 $
沒有特殊意義,而是代表它們自己。"(a*(.)%w(%s*))"
中,與 "a*(.)%w(%s*)"
匹配的字串部分會被儲存為第一個捕獲(因此編號為 1);與 .
匹配的字元會被捕獲為編號 2,而與 %s*
匹配的部分則會被捕獲為編號 3。()
會捕獲目前的字串位置(一個數字)。例如,如果我們在字串 "flaaap"
上應用模式 "()aa()"
,將會有兩個捕獲:3 和 5。%z
。table
內。{table}
[, {sep}
[, {i}
[, {j}
]]]) table.concat()table[i]..sep..table[i+1] ... sep..table[j]
。{sep}
的預設值為空字串,{i}
的預設值為 1,而 {j}
的預設值為表格的長度。如果 {i}
大於 {j}
,則會回傳空字串。{table}
, {f}
) table.foreach(){table}
的所有元素執行給定的 {f}
。對於每個元素,會以索引和對應的值作為引數呼叫 {f}
。如果 {f}
回傳非 `nil` 值,則會中斷迴圈,並將此值作為 table.foreach
的最終值回傳。{table}
, {f}
) table.foreachi(){table}
的數值索引執行給定的 {f}
。對於每個索引,會以索引和對應的值作為引數呼叫 {f}
。索引會依序從 1 遍歷到 n
,其中 n
是表格的長度。如果 {f}
回傳非 `nil` 值,則會中斷迴圈,並將此值作為 table.foreachi
的結果回傳。{table}
, [{pos}
,] {value}
) table.insert(){value}
插入到 {table}
中的位置 {pos}
,如有必要,會將其他元素向上移動以騰出空間。{pos}
的預設值為 n+1
,其中 n
是表格的長度(請參閱 lua-length),因此呼叫 table.insert(t,x)
會將 x
插入到表格 t
的末尾。{table}
[, {pos}
]) table.remove(){table}
中移除位置 {pos}
的元素,如有必要,會將其他元素向下移動以關閉空間。回傳移除元素的值。{pos}
的預設值為 n
,其中 n
是表格的長度(請參閱 lua-length),因此呼叫 table.remove(t)
會移除表格 t
的最後一個元素。{table}
[, {comp}
]) table.sort()in-place
排序,從 table[1]
到 table[n]
,其中 n
是表格的長度(請參閱 lua-length)。如果給定 {comp}
,則它必須是一個接收兩個表格元素,且當第一個元素小於第二個元素時回傳 true 的函式(因此排序後 not comp(a[i+1],a[i])
將會是 true)。如果未給定 {comp}
,則會改用標準 Lua 運算子 <
。math
內。[0,1)
的偽隨機實數。當帶有一個數字 {m}
呼叫時,math.random
會回傳一個範圍在 [1, m]
的偽隨機整數。當帶有兩個數字 {m}
和 {n}
呼叫時,math.random
會回傳一個範圍在 [m, n]
的偽隨機整數。io
提供。當使用顯式的檔案描述符時,操作 io.open
會回傳一個檔案描述符,然後所有操作都作為檔案描述符的方法提供。io
也提供了三個預定義的檔案描述符,它們的含義與 C 語言中的相同:io.stdin
、io.stdout
和 io.stderr
。nil
(外加一個錯誤訊息作為第二個結果),而在成功時回傳一個與 nil
不同的值。{file}
]) io.input()for line in io.lines(filename) do
body
end
nil
(以結束迴圈)並自動關閉檔案。io.lines()
(不帶檔案名稱)等同於 io.input():lines()
;也就是說,它會迭代預設輸入檔案的行。在這種情況下,當迴圈結束時,它不會關閉檔案。{filename}
[, {mode}
]) io.open(){mode}
中指定的模式開啟檔案。它會回傳一個新的檔案句柄,或者,如果發生錯誤,則會回傳 nil
外加一個錯誤訊息。{mode}
字串可以是下列任何一個"r"
讀取模式(預設);"w"
寫入模式;"a"
附加模式;"r+"
更新模式,保留所有先前資料;"w+"
更新模式,清除所有先前資料;"a+"
附加更新模式,保留先前資料,只允許在檔案結尾寫入。{mode}
字串的結尾也可以有一個 b
,在某些系統中,需要使用它才能以二進位模式開啟檔案。這個字串與標準 C 函式 fopen
中使用的字串完全相同。{prog}
[, {mode}
]) io.popen(){prog}
,並回傳一個檔案句柄,您可以使用它來從此程式讀取資料(如果 {mode}
是 "r"
,預設值)或將資料寫入此程式(如果 {mode}
是 "w"
)。{obj}
) io.type(){obj}
是否為有效的檔案句柄。如果 {obj}
是已開啟的檔案句柄,則回傳字串 "file"
;如果 {obj}
是已關閉的檔案句柄,則回傳 "closed file"
;如果 {obj}
不是檔案句柄,則回傳 nil
。for line in file:lines() do
body
end
io.lines
不同,此函式不會在迴圈結束時關閉檔案。){...}
) file:read()file
,這些格式指定要讀取的內容。對於每個格式,函式會回傳一個包含讀取字元的字串(或數字),如果無法使用指定的格式讀取資料,則回傳 nil
。當不帶格式呼叫時,它會使用預設格式來讀取整個下一行(請參閱下文)。"*n"
讀取一個數字;這是唯一一個會回傳數字而不是字串的格式。 "*a"
從目前位置開始讀取整個檔案。在檔案結尾時,它會回傳空字串。 "*l"
讀取下一行(跳過行尾符號),在檔案結尾時回傳 nil
。這是預設格式。 number
讀取一個最多包含該數字的字元數的字串,在檔案結尾時回傳 nil
。如果 number 為零,則不讀取任何內容,並回傳空字串,或在檔案結尾時回傳 nil
。{whence}
] [, {offset}
]) file:seek(){offset}
加一個由字串 {whence}
指定的基礎位置的位置,如下所示"set"
:基礎位置是 0(檔案開頭);"cur"
:基礎位置是目前位置;"end"
:基礎位置是檔案結尾;seek
會回傳最終的檔案位置,以從檔案開頭算起的位元組為單位。如果此函式失敗,則會回傳 nil
,外加一個描述錯誤的字串。{whence}
的預設值為 "cur"
,而 {offset}
的預設值為 0。因此,呼叫 file:seek()
會回傳目前的檔案位置,而不變更它;呼叫 file:seek("set")
會將位置設定為檔案開頭(並回傳 0);而呼叫 file:seek("end")
會將位置設定為檔案結尾,並回傳其大小。"no"
無緩衝;任何輸出操作的結果都會立即出現。 "full"
完全緩衝;只有當緩衝區已滿時(或當您明確 flush
檔案時(請參閱io.flush())才會執行輸出操作。 "line"
行緩衝;輸出會緩衝,直到輸出換行符號,或從某些特殊檔案(例如終端設備)有任何輸入為止。{size}
會指定緩衝區的大小,以位元組為單位。預設值為適當的大小。{...}
) file:write()file
。引數必須是字串或數字。若要寫入其他值,請在 write
之前使用 tostring
tostring() 或 string.format
string.format()。os
實作。{format}
以 !
開頭,則日期會以協調世界時格式化。在此選擇性字元之後,如果 {format}
是字串 "*t"
,則 date
會回傳一個包含下列欄位的表格:year
(四位數字)、month
(1-12)、day
(1-31)、hour
(0-23)、min
(0-59)、sec
(0-61)、wday
(星期幾,星期日是 1)、yday
(一年中的第幾天)和 isdst
(日光節約旗標,一個布林值)。{format}
不是 "*t"
,則 date
會回傳以字串表示的日期,並依照與 C 函式 strftime
相同的規則格式化。date
會回傳合理的日期和時間表示形式,這取決於主機系統和目前的地區設定(也就是說,os.date()
等同於 os.date("%c")
)。{t2}
, {t1}
) os.difftime(){t1}
到時間 {t2}
的秒數。在 POSIX、Windows 和其他某些系統中,此值完全等於 t2 - t1
。{command}
]) os.execute()system
。它會將 {command}
傳遞給作業系統 Shell 執行。它會回傳一個狀態碼,該狀態碼與系統相關。如果沒有 {command}
,則在 Shell 可用的情況下會回傳非零值,否則會回傳零。{oldname}
, {newname}
) os.rename(){oldname}
的檔案重新命名為 {newname}
。如果此函式失敗,則會回傳 nil
,以及描述錯誤的字串。{locale}
[, {category}
]) os.setlocale(){locale}
是一個指定地區設定的字串;{category}
是一個可選的字串,描述要變更的類別:"all"
、"collate"
、"ctype"
、"monetary"
、"numeric"
或 "time"
;預設類別為 "all"
。此函式會回傳新的地區設定名稱,如果無法滿足請求,則回傳 nil
。{table}
]) os.time()year
、month
和 day
,並且可以具有欄位 hour
、min
、sec
和 isdst
(有關這些欄位的描述,請參閱 os.date
函式 os.date())。time
回傳的數字只能作為 date
和 difftime
的引數使用。debug
表格內提供。所有在執行緒上運作的函式都有一個可選的第一個引數,它是要操作的執行緒。預設值始終是目前的執行緒。cont
的行會結束此函式,以便呼叫者繼續執行。debug.debug
的命令在任何函式中都不是詞法巢狀的,因此無法直接存取區域變數。{thread}
]) debug.gethook()debug.sethook
函式設定)。{thread}
,] {function}
[, {what}
]) debug.getinfo(){function}
的值,這表示在給定執行緒的呼叫堆疊的 {function}
層級執行的函式:層級 0 是目前的函式(getinfo
本身);層級 1 是呼叫 getinfo
的函式;依此類推。如果 {function}
是一個大於活動函式數量的數字,則 getinfo
會回傳 nil
。lua_getinfo
回傳的所有欄位(請參閱 lua_getinfo()),其中字串 {what}
描述要填寫的欄位。{what}
的預設值是取得所有可用的資訊,但有效的行表格除外。如果存在,選項 f
會新增一個名為 func
的欄位,其中包含函式本身。如果存在,選項 L
會新增一個名為 activelines
的欄位,其中包含有效行的表格。debug.getinfo(1,"n").name
會回傳目前函式的名稱(如果可以找到合理的名稱),而 debug.getinfo(print)
會回傳一個包含有關 print
函式的所有可用資訊的表格。{thread}
,] {level}
, {local}
) debug.getlocal(){level}
層級的函式的索引 {local}
的區域變數的名稱和值。(第一個參數或區域變數的索引為 1,依此類推,直到最後一個活動的區域變數。)如果沒有具有給定索引的區域變數,則函式會回傳 nil
,並且在呼叫的 {level}
超出範圍時會引發錯誤。(您可以呼叫 debug.getinfo
debug.getinfo() 以檢查層級是否有效。)(
(左括號) 開頭的變數名稱表示內部變數 (迴圈控制變數、暫時變數和 C 函式區域變數)。{func}
, {up}
) debug.getupvalue(){func}
的索引 {up}
的上值名稱和值。如果沒有具有給定索引的上值,則函式會回傳 nil
。{thread}
,] {hook}
, {mask}
[, {count}
]) debug.sethook(){mask}
和數字 {count}
描述何時呼叫 Hook。字串遮罩可以具有以下字元,並具有給定的含義"c"
:每次 Lua 呼叫函式時,都會呼叫 Hook;"r"
:每次 Lua 從函式回傳時,都會呼叫 Hook;"l"
:每次 Lua 進入新的程式碼行時,都會呼叫 Hook。{count}
不等於零,則在每執行 {count}
個指令後,都會呼叫 Hook。debug.sethook
會關閉 Hook。"call"
、"return"
(或「tail return」)、"line"
和 "count"
。對於行事件,Hook 也會取得新行號作為其第二個參數。在 Hook 內部,您可以使用層級 2 呼叫 getinfo
,以取得有關執行函式的更多資訊(層級 0 是 getinfo
函式,層級 1 是 Hook 函式),除非事件是 "tail return"
。在這種情況下,Lua 只會模擬回傳,呼叫 getinfo
會回傳無效的資料。{thread}
,] {level}
, {local}
, {value}
) debug.setlocal(){value}
指派給堆疊 {level}
層級的函式的索引 {local}
的區域變數。如果沒有具有給定索引的區域變數,則函式會回傳 nil
,並且在呼叫的 {level}
超出範圍時會引發錯誤。(您可以呼叫 getinfo
來檢查層級是否有效。)否則,它會回傳區域變數的名稱。{func}
, {up}
, {value}
) debug.setupvalue(){value}
指派給函式 {func}
的索引 {up}
的上值。如果沒有具有給定索引的上值,則函式會回傳 nil
。否則,它會回傳上值的名稱。{thread}
,] [{message}
[,{level}
]]) debug.traceback(){message}
字串。可選的 {level}
數字會告知從哪個層級開始追蹤(預設值為 1,即呼叫 traceback
的函式)。