Help:Lua/基本
_G[编辑源代码]
这个变量持有对当前全局变量表的引用,例如,全局变量foo也会被关联到_G.foo。注意,_G本身并没有什么特别的,可以被以同样的方式作为任何其他变量。
注意:在Lua模块中,请不要修改全局变量,因此也不要修改这个表的内容。
_VERSION[编辑源代码]
正在运行的Lua语言版本的字符串"Lua 5.1"
。
assert[编辑源代码]
用法:assert(v, message, ...)
,其中message ...
可省略。
断言v成立,如果v不成立,则抛出错误。
如果v是nil或false,message就会用作错误的文本:如果错误文本为nil(或者未指定),则文本是"assertion failed!"
(“断言失败!”);如果是字符串或者数字,文字就是那个值;否则assert本身就会抛出错误。
如果v是任何其他的值,assert就会返回包括v和message在内的全部变量。
在Lua的一个比较常见的惯用用法是,一个函数在正常操作时返回true值,并在失败时返回nil或false以及错误信息。可以调用assert函数以进行简单的错误检查。
-- 这个不会检查错误
local result1, result2, etc = func(...)
-- 这个作用相同,但是会查错
local result1, result2, etc = assert( func(...) )
error[编辑源代码]
用法:error(message, level)
,其中message
和level
均可省略。
抛出错误,错误消息为message。
error一般会提供出错的位置的信息。如果level是1或者省略,那么信息就是调用error本身的位置,2使用被调用错误的函数调用的位置,等等。0会省略位置信息。
getfenv[编辑源代码]
用法:getfenv(f)
注意,这个函数可能会无效,取决于配置中的allowEnvFuncs
。
返回运行环境(全局变量表),就像f指定的:
- 如果1、nil或者未指定,返回调用getfenv函数的环境。通常这与_G相同。
- 整数2~10返回更高一级的环境。例如,2返回被这一个函数调用的函数的环境,3返回调用这一个函数的函数的环境,以此类推。如果这个堆栈值越高,错误也会随之上升,否则这个堆栈级别会返回尾调用(tail call)。
- 传递函数返回在调用该函数时将使用的环境。
所有的基本函数和Scribunto基本库函数使用的环境都被保护。尝试用getfenv访问这些环境会返回nil。
getmetatable[编辑源代码]
用法:getmetatable(t)
返回表t的元表。如果t是其他类型,返回nil。
如果元表拥有__metatable字段,则直接返回这个字段的值,而不是返回实际的元表。因此__metatable字段常用来保护元表,防止其被获取。
local mt = {}
local t = setmetatable({}, mt)
print(getmetatable(t)) -- 保护元表之前,正常获取元表。
mt.__metatable = "元表受保护了!"
print(getmetatable(t)) -- 保护元表之后,会获取__metatable。
输出:
table 元表受保护了!
ipairs[编辑源代码]
用法:ipairs(t)
返回3个值:迭代函数、表t和0。迭代数对(1, t[1])
、(2,t[2])
等,直到t[i]
是nil。
t = {"a", "b", "c", "d", nil, "f"}
for k,v in ipairs(t) do
print(k, v)
end
输出:
1 a 2 b 3 c 4 d
__ipairs元方法可以用来覆盖该函数的行为,如果该元方法存在,调用ipairs(t)会调用该元方法。
next[编辑源代码]
用法:next(t, key)
,key可省略。
可遍历表t中的键。如果key是nil或者未指定,返回表中的第一个键和值,否则,返回下一个键和值。如果没有更多的键可以用,返回nil。可以通过使用next(t) == nil
来检查表是否是空的。
注意键被返回的顺序是不确定的。如要以数字顺序遍历数组,应使用ipairs。
pairs[编辑源代码]
用法:pairs(t)
返回三个值:迭代器函数(next或者类似的)、表t和nil,常用于for的迭代器形式。
t = {
Massif = "山丘",
Sky = "天空",
Forest = "森林",
Desert = "沙漠",
Volcano = "火山"
}
for k,v in pairs(t) do
print(k,v)
end
输出:
Sky 天空 Forest 森林 Massif 山丘 Volcano 火山 Desert 沙漠
元表中的__pairs元方法(若有)可用来覆盖该元素的行为,如果存在__pairs元方法,则调用pairs(t)时会调用该元方法。
pcall[编辑源代码]
用法:pcall(f, ...)
用指定的参数在“保护模式”下调用函数f。这意味着如果在调用f时出错,pcall会返回false和错误消息。如果没有错误发生,pcall会返回true与调用返回的所有值。
以下示例为交互式编程界面:
> pcall(string.reverse, "Rolling Sky")
true ykS gnilloR
> pcall(string.reverse, true)
false bad argument #1 to 'string.reverse' (string expected, got boolean)
rawequal[编辑源代码]
用法:rawequal(a, b)
类似于a==b
,但是忽略__eq元方法。
rawget[编辑源代码]
用法:rawget(t, k)
类似于t[k]
,但是忽略__index元方法。
rawset[编辑源代码]
用法:rawset(t, k, v)
类似于t[k] = v
,但是忽略__newindex元方法。
require[编辑源代码]
用法:require(modulename)
从本Wiki的指定模块页面加载模块,返回那个模块返回的值。例如,local mod = require "模块:Arguments"
会加载模块:Arguments,并将其返回的值赋值给变量mod
。如果指定的模块不存在,则会抛出错误。
该函数首先会检查package.loaded[modulename]
以检查相同模块是否已经加载过,如果是,则直接将已经加载过的模块返回。
否则,返回package.loaders
序列中的每一个加载器以尝试寻找模块的加载器。若找到加载器,则调用这个加载器。加载器返回的值存储在package.loaded[modulename]
中并将其返回。
注意:如果需要加载大量数据,应当使用mw.loadData
,该函数也会加载模块,但其返回的值必须是表,且表的内容不允许函数等数据类型。但是对于大量数据,这样加载的效率更高,且每个页面只会加载一次。因此对于仅储存大量数据的模块,应当使用mw.loadData
而非使用require
。请参考Help:Lua/mw#loadData以了解详情。
select[编辑源代码]
用法:select(index, ...)
选择“...
”中的部分。index可以是数字或者字符串"#"
。
如果index是数字,返回index之后的...
中对应位置的数。如果index是字符串"#"
,返回...
中参数的个数。
> select(3,'a','b','c','d',nil) -- 这个nil不会被忽略
c d nil
> select(-2,'a','b','c','d',nil)
d nil
> select('#','a','b','c','d',nil)
5
setmetatable[编辑源代码]
用法:setmetatable(t, mt)
将表t的元表设置为mt,同时返回设置了元表后的表。mt可以是nil,但是不能省略。
如果t的实际元表有__metatable字段,则这个元表会被保护,setmetatable会抛出错误。
tonumber[编辑源代码]
用法:tonumber(value, base)
,base
默认为10。
尝试将value转化为数字。如果value已经是数字,或者是可以转化为数字的字符串,则返回这个数字,否则会返回nil。
base是可选的,默认为10,指定解析数字的进位基数。这个基数可以是2到36之间的任何整数。对于大于10,字母A(大小写均可)代表10,B代表11,以此类推,Z代表35。
十进制下,值可以有小数部分,或者以科学计数法表示,而且甚至可以以“0x”开头以表示16进制。其他情况,只会接受不带符号的整数。
tostring[编辑源代码]
用法:tostring(value)
将value转化为字符串。函数会转化为"function"
,表转化为"table"
(受元表影响的除外)。
下例为交互式编程界面:
> tostring(true)
true
> tostring{1,2,3}
table
> tostring(print)
function
对于表,标准的行为可以被__tostring元方法覆盖。如果这个元方法存在,那么调用tostring会返回由__tostring(value)返回的单个值。
type[编辑源代码]
type(value)
以字符串形式返回value的类型:"nil"
、"number"
、"string"
、"boolean"
、"table"
或"function"
。
unpack[编辑源代码]
用法:unpack(t, i, j)
,i
和j
可省略,默认为1和#t
。
一般情况下,unpack(t)
会将数组t的值直接拆解成多个值,像t[1], t[2], t[3], ..., t[#t]
这样。
如果给定了i和j,则会返回第i到j个值,像t[i], t[i+1], ..., t[j]
这样。
这里用交互式编程简单展示unpack的功能[1]。
> t = {1,2,3}
> =unpack(t)
1 2 3
> =unpack(t,2)
2 3
> =unpack(t,nil,2)
1 2
> =unpack(t,1,5)
1 2 3 nil nil
> a,b,c=unpack(t)
> =a
1
> =b
2
> =c
3
注意如果t不是一个标准的数组,且j是nil或未指定,则结果是不确定的。
在新版本的Lua中,unpack函数不再是基本函数,而是table库中的函数,即table.unpack。
xpcall[编辑源代码]
用法:xpcall(f, errhandler)
类似于#pcall,但是错误消息在返回之前传递到函数errhandler中,也就是说,如果捕获到错误,会在返回false和错误信息之前调用errhandler(错误信息)
。
- ↑ 在新版本的Lua中,表达式可以直接单独一行,但是对于MediaWiki使用的Lua 5.1,还不能够这样使用,因此要在表达式前面加上“=”,或者调用print函数。