核心函数教程

lua-users home
wiki

本页涵盖参考手册的 5.1 节。[1] 这些函数提供了对 Lua 核心功能的访问。我们不会详细介绍所有主题,但会链接到教程的其他部分以获取更多详细信息。

assert(test, [message])

assert [2] 类似于 C 语言中的 assert() 函数。如果测试条件为 falsenil,则会引发错误;否则返回 test。可选的用户定义消息包含在引发的错误中。另外,请参阅 error() 函数。例如:

> assert(1==1)          -- no error as test was true
> assert(1==0)
stdin:1: assertion failed!
stack traceback:
        [C]: in function `assert'
        stdin:1: in main chunk
        [C]: ?
> assert("green"=="blue", "Colours not equal")
stdin:1: Colours not equal
stack traceback:
        [C]: in function `assert'
        stdin:1: in main chunk
        [C]: ?

许多 Lua 函数,例如 io.open,在成功时返回值,在失败时返回 nil 和错误消息。这与 assert 配合良好。

file = assert(io.open(filename))

这要么以 filename 打开文件进行读取并将其分配给 file,要么引发一个错误,其消息来自 io.open 的第二个返回值。

collectgarbage(opt [, arg])

待定: [3]

dofile(filename)

待定: [4]

error(message [, level])

待定: [5]

_G

_G [6] 是一个指向全局环境的全局变量。例如,要显示所有全局变量,我们可以这样做:

> table.foreach(_G,print)
string  table: 00357098
xpcall  function: 00354E10
tostring        function: 00354708
gcinfo  function: 00354E90
loadlib function: 00358B40
os      table: 00355AE0
unpack  function: 003547C8
level   2
require function: 00354F90
getfenv function: 00354548
... -- etc.

_G 也是递归的,因为 _G 存在于 _G 中!也就是说,以下都指向同一个表(它保存全局变量):

> = _G
table: 00353710
> = _G._G
table: 00353710
> = _G._G._G
table: 00353710

Lua 本身不使用此变量,因此更改其值不会影响任何环境。您应该使用 setfenv() 来更改环境。

getfenv(f)

待定: [7]

getmetatable(object)

待定: [8]

ipairs(t)

待定: [9]

load(func [, chunkname])

待定: [10]

loadfile(filename)

待定: [11]

loadstring(string [, chunkname])

待定: [12]

module(name [, ])

待定: [13]

next(table [, index])

待定: [14]

pairs(t)

待定: [15]

pcall(f, arg1, ...)

待定: [16]

print(e1, e2, ...)

print [17] 可以接受任意数量的逗号分隔的参数,它会将这些参数的值打印到标准输出。print 使用 tostring 将参数转换为字符串形式进行打印。例如:

> print(1,2,"buckle my shoe", 22/7)
1       2       buckle my shoe  3.1428571428571

print 非常简单,不会递归地打印表的内容,它只会打印类型和唯一的 ID。

> print({1,2,3})
table: 002FE9C8

print 不会格式化文本。为了实现这一点,您应该使用 string.format() 函数结合 print(请参阅 StringLibraryTutorial)。例如:

> print(string.format("Pi is approximately %.4f", 22/7))
Pi is approximately 3.1429

rawequal(v1, v2)

待定: [18]

rawget(table, index)

待定: [19]

rawset(table, index, value)

待定: [20]

require(packagename)

待定: [21]

select(index, ...)

待定: [22]

setfenv(f, table)

待定: [23]

setmetatable(table, metatable)

待定: [24]

tonumber(e [, base])

待定: [25]

tostring(e)

tostring [26] 将其参数(如果有多于一个参数,则只转换第一个参数)转换为字符串并返回该字符串。print 是使用 tostring 实现的,所以您可能已经熟悉了输出格式。简单值(数字、字符串、布尔值和 nil)的转换与您预期的相符。表、用户数据和线程将打印为“table:”、“userdata:”或“thread:”,后跟内部解释器对象的地址(不应依赖于此)。

请注意,与 print 不同,tostring 不会打印任何内容,它只会将其参数转换为字符串并返回。

tostring 的行为是可扩展的。如果要转换的值有一个带有 __tostring 条目的元表,则会调用该条目,并将要转换的值作为参数传递,返回该调用的结果。这允许您通过为其提供带有 __tostring 函数的元表来更改 tostring 对(某些)表的工作方式,该函数执行您想要的转换。

type(v)

type [27] 返回一个描述传递给它的对象的类型的字符串。

> = type(1), type(true), type("hello"), type({}), type(function() end)
number  boolean string  table   function

请注意,nil 的类型是“nil”。

> =type(nil)
nil

Lua 5.0 中可能的类型返回有:“number”、“string”、“boolean”、“table”、“function”、“thread”和“userdata”。“thread”是协程,“userdata”是 C 数据类型,在 Lua 中对其有引用。

unpack(list)

unpack [28] 将列表的元素解包并返回它们,例如:

> = unpack( {1,2,3} )
1       2       3
> = unpack( {"one",2,6*7} )
one     2       42

解包的元素数量由表的长度决定,这不一定等于表中元素的数量!有关详细信息,请参阅 TableLibraryTutorial

> t = {"one",2,6*7}
> t.n = 2
> = table.getn(t)
2
> = unpack(t)
one     2

_VERSION

直接摘自手册,_VERSION [29] 是“一个全局变量(不是函数),它保存包含当前解释器版本的字符串。”

> = _VERSION
Lua 5.1

xpcall(f, err)

待定: [30]

RecentChanges · preferences
编辑 · 历史
最后编辑于 2016年8月11日 15:48 GMT (差异)