Help:Lua/基本

来自滚动的天空Wiki

_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),其中messagelevel均可省略。

抛出错误,错误消息为message。

error一般会提供出错的位置的信息。如果level是1或者省略,那么信息就是调用error本身的位置,2使用被调用错误的函数调用的位置,等等。0会省略位置信息。

可以用pcallxpcall来捕获错误。

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)ij可省略,默认为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(错误信息)

  1. 在新版本的Lua中,表达式可以直接单独一行,但是对于MediaWiki使用的Lua 5.1,还不能够这样使用,因此要在表达式前面加上“=”,或者调用print函数。