• 做一个幸福的人,读书,旅行,努力工作,关心身体和心情。
  • 不管有没有人爱,也要努力做一个可爱的人。不埋怨谁,不嘲笑谁,也不羡慕谁,阳光下灿烂,风雨中奔跑,做自己的梦,走自己的路。

Lua 5.1 基础函数

Lua编程 lcq 5年前 (2013-08-29) 525次浏览 0个评论

基础函数

基础库给Lua提供一些核心函数。如果你的程序中没有包含该库,你需要仔细检查是否需要为一些它的设备提供实现。


assert (v [, message])

当参数v的值为假(例如nilfalse)时放出一个错误;否则,返回它的所有参数。message是条错误消息;忽略时,缺省为“assertion failed!”。


collectgarbage (opt [, arg])

该函数是垃圾收集器的通用接口。它根据第一参数提供不同的功能,opt

“stop”: 停止垃圾收集器。

“restart”: 重新启动垃圾收集器。

“collect”: 执行一个完整的垃圾收集周期。

“count”: 返回Lua中已用内存总量(以Kbyte为单位)。

“step”: 执行一个垃圾收集step。step“尺寸”由arg(值越大意味着越多的step)以一种未指定的方式控制。如果要控制step尺寸,必须以实验的方式调整arg的值。如果step完成一个收集周期则返回true

“setpause”: 设置收集器的pause(见§2.10)的新值为arg。返回前一个pause值。

“setstepmul”: 设置收集器的step multiplier(见§2.10)的新值为arg。返回前一个tep值。


dofile (filename)

打开命名文件并将其内容作为一个Lua单元执行。当空参调用时,dofile执行标准输入(stdin)的内容。返回单元返回的所有值。在发生错误的情况下,dofile将错误传播到其调用者(即dofile不是运行于保护模式)。


error (message [, level])

终止最近的受保护的函数调用并返回message作为错误消息。函数error绝不返回。

通常,error在消息的开头增加关于错误位置的信息。level参数指定如何获得错误位置。 用级别1(缺省的)时,错误位置是error函数被调用处。级别2指向调用error的函数的调用处。传递级别0避免向消息附加错误位置信息。


_G

持有全局环境的全局变量(非函数)(即_G._G = _G)。Lua自身并不使用该变量;改变其值不影响任何环境,反之亦然。(使用setfenv来改变环境。)


getfenv ([f])

返回函数的当前环境。f可以是Lua函数或指定调用栈级别的数字:级别1是调用getfenv的函数。如果给出的函数不是Lua函数或者f为0,getfenv返回全局环境。f缺省为1。


getmetatable (object)

如果object没有元表,返回nil。否则,如果对象的元表具有"__metatable"字段,返回关联的值。否则返回给定对象的元表。


ipairs (t)

返回三个值:迭代器函数、表t和0,所以结构

将迭代键值对(1,t[1])、(2,t[2])、···,直到第一个不存在于表中的整数键。


load (func [, chunkname])

通过用func函数获取代码片的方式载入单元。对func的每次调用必须返回一个与先前的结果串联的字符串。返回空串、nil或无值告知单元结束。

如果没有错误,将编译的单元作为函数返回;否则返回nil以及错误消息。被返回的函数的环境是全局环境。

chunkname作为单元名用于错误消息和调试信息。当省略时,缺省为“=(load)”。


loadfile ([filename])

load类似,但是从文件filename中获取单元,如果未给出文件名则从标准输入获取。


loadstring (string [, chunkname])

load类似,但是从给定的字符串获得单元。

要载入并运行给定的字符串,使用惯用法:

当省略时,chunkname缺省为给定的字符串。


next (table [, index])

允许程序遍历表的所有字段。它的第一参数是表,第二参数是该表中的索引。next返回表的下一个索引及其关联的值。当以nil作为第二参数调用时,next返回初始索引和关联的值。当以最后的索引调用或以nil调用空表时,next返回nil。如果省略第二参数,它被解释为nil。特别地,可用next(t)测试表是否为空。

索引被列举的顺序是未指定的,即使是数字索引。(要以数字顺序遍历表,使用数字foripairs函数。)

如果在遍历期间给表中不存在的字段赋任意值,则next的行为是未定义的。然而,你可以修改已经存在的字段。特别地,你可以清空已经存在的字段。


pairs (t)

返回三个值:next函数、表tnil,所以结构

将迭代表t的所有键-值对。

参阅函数next关于其遍历期间对表修改的警告。


pcall (f, arg1, ···)

用给定参数以保护模式(protected mode)调用函数f。这意味着f内的任何错误都不被传播;代替的做法是,pcall捕获错误并返回一个状态码。它的第一结果是状态码(布尔),如果调用成功无误则为true。在这种情况下,pcall也在第一结果之后返回来自调用的所有结果。在任何错误的情况下,pcall返回false以及错误消息。


print (···)

接受任意数量的参数,打印它们的值到标准输出(stdout),方式是利用tostring函数将他们转换为字符串。print不是打算给格式化的输出使用的,而是作为一种快速显示值的方式,特别是对调试。对于格式化的输出,使用string.format


rawequal (v1, v2)

检查v1v2是否相等,不会调用任何元方法。返回布尔值。


rawget (table, index)

获取table[index]的实际值,不会调用任何元方法。table必须是个表;index可以是任何值。


rawset (table, index, value)

设置table[index]的实际值为value,不会调用任何元方法。table必须是个表,index可以是任何非nil值,并且value可以是任何Lua值。

该函数返回


select (index, ···)

如果index是数字,返回参数数字index之后的所有参数。否则,index必须是字符串"#",并且select返回它收到的额外参数的总数。


setfenv (f, table)

设置给定函数要用的环境。f可以是Lua函数或栈中指定级别的函数:级别1是调用setfenv的函数。setfenv返回给定的函数。

作为特例,当f为0时setfenv改变当前运行线程的环境。在该情况下,setfenv不返回值。


setmetatable (table, metatable)

为给定表设置元表。(你不能从Lua中改变其他类型的元表,只能从C中。)如果metatablenil,移除给定表的元表。如果原始元表具有"__metatable"字段,产生一个错误。

该函数返回table


tonumber (e [, base])

尝试将参数转换为数字。如果参数已经是数字或可转换为数字的字符串,则tonumber返回该数字;否则返回nil

可选参数指定如何解释数字的基数。基数可以是2和36之间的任何整数,也包括它们。在高于10的基数中,字母’A‘(大小写皆可)表示10,’B‘表示11,以此类推,直到’Z‘表示35。在基数为10(缺省)时,数字可有小数部分,也可有可选的指数部分(见§2.1)。其他基数只接受无符号整数。


tostring (e)

接受任意类型的参数并以合理的格式将其转换为字符串。对于完全控制数字如何转换,使用string.format

如果e的元表有"__tostring"字段,则tostringe为参数调用相应的值,并用调用的结果为其结果。


type (v)

返回其仅有参数的类型,编码为一个字符串。该函数的可能结果是”nil“(字符串,不是值nil)、”number“、”string“、”boolean“、”table“、”function“、”thread“和”userdata“。


unpack (list [, i [, j]])

返回给定表的元素。该函数等价于

除了上面的代码只能用在元素数量固定的情况。缺省时,i是1而j是列表的长度,就像取长操作符(见§2.5.5)定义的那样。


_VERSION

保存含有当前解释器版本的字符串的全局变量(非函数)。该变量的当前内容是“Lua 5.1”。


xpcall (f, err)

该函数类似pcall,除了可以设置新的错误处理器。

xpcallerr作为错误处理器,在保护模式中调用函数ff内的错误不被传播;代替做法是,xpcall捕获错误,以原始错误对象调用err函数,并返回一个状态码。它的第一结果是状态码(布尔值),如果调用成功无误则为true。在该情况下,xpcall也在该第一结果后面返回来自调用的所有结果。在错误的情况下,xpcall返回false以及来自err的结果。

5.2 – 协程操作

涉及协程的操作由基础库的一个子库组成,并且出现在表coroutine内。关于协程的全面描述见§2.11


coroutine.create (f)

f主体创建一个新协程。f必须是Lua函数。返回该新协程,它是类型为“thread”的对象。


coroutine.resume (co [, val1, ···])

启动或继续协程co的执行。首次恢复协程时,它启动运行协程主体。值val1, ···是传入主体函数的参数。如果协程被中断了,resume重新启动它;值val1, ···作为yield的结果。

如果协程运行无误,resume返回true以及传入yield(如果协程中断)的任何值或由主体函数(如果协程结束)返回的任何值。如果有任何错误,resume返回false以及错误消息。


coroutine.running ()

返回运行的协程,或者当被主线程调用时返回nil


coroutine.status (co)

返回协程co的状态,以字符串的方式:如果协程正在运行(即是它调用了status)则为“running”;如果协程被yield调用暂停或还未启动运行则为“suspended”;如果协程是活动的但不在运行中(即它恢复了另一个协程)则为“normal”;如果协程结束了它的主体函数或出错停止则为"dead"


coroutine.wrap (f)

f主体创建一个新协程。f必须是Lua函数。返回一个函数,每次调用它会恢复协程。传入该函数的任何参数都作为resume的额外参数。返回值同resume相同,除了第一个布尔值。在发生错误情况下传播错误。


coroutine.yield (···)

暂停调用者协程的执行。协程不能正在运行C函数、元方法或迭代器。yield的任何参数传给resume作为额外的结果。

5.3 – 模块

打包库为在Lua中加载和创建模块提供基础设备。它直接导出两个函数到全局环境中:requiremodule。其他东西都导出到表package中。


module (name [, ···])

创建一个模块。如果在package.loaded[name]中有个表,该表就是模块。否则,如果有个给定名字的全局表t,该表就是模块。否则创建新表t并把它设为全局namepackage.loaded[name]的值。该函数也用给定的名字初始化t._NAME,用模块(t自身)设置t._M,并用包名设置t._PACKAGE(完整模块名减去最后部分;见下)。最后,module设置t为当前函数的新环境和package.loaded[name]的新值,因此require返回t

如果name是个复合名字(即用点号分隔的几个部分),module为每个部分创建(或重用,如果它们已经存在)表。例如,如果namea.b.c,则module在全局a的字段b的字段c中存储模块表。

该函数可接受模块名后可选的options,其中每个选项是要加入模块的函数。


require (modname)

加载给定模块。该函数先浏览表package.loaded确认modname是否已经加载了。如果是,require返回存储在package.loaded[modname]中的值。否则,它尝试为模块找到一个加载器(loader)

数组package.loaders指示require如何寻找加载器。通过改变该数组,我们可以改变require如何寻找模块。下面的解释基于package.loaders的缺省配置。

require首先查询package.preload[modname]。如果它有值,该值(应是个函数)就是加载器。否则require使用存储在package.path中的路径搜索一个Lua加载器。如果那也失败了,它用存储在package.cpath中的路径搜索一个C加载器。如果也失败了,它尝试一个一体化(all-in-one)加载器(见package.loaders)。

一旦找到,require用单个参数modname调用这个加载器。如果加载器返回任何值,require把返回值赋给package.loaded[modname]。如果加载器不返回值而且没有赋给package.loaded[modname]任何值,requiretrue赋给该条目。在任何情况下,require返回package.loaded[modname]的最终值。

如果加载或运行模块时发生任何错误,或者如果不能为模块找到任何加载器,require导致一个错误。


package.cpath

该路径被require用于搜索一个C加载器。

Lua用同初始化Lua路径package.path一样的方式初始化C路径package.cpath,利用环境变量LUA_CPATH或一个定义在luaconf.h中的缺省路径。


package.loaded

require用来控制已经加载了哪些模块。当你require一个模块modname而且package.loaded[modname]不为假时,require只是返回存储在那儿的值。


package.loaders

require用来控制如何加载模块的表。

该表的每个条目是个搜索器函数(searcher function)。当查找模块时,require按照升序逐个调用这些搜索器,并用模块名(传给require的参数)作为它的唯一参数。该函数可返回另一个函数(模块加载器)或一条解释为何没找到模块的字符串(或nil,如果没话可说)。Lua用四个函数初始化该表。

第一个搜索器只是在表package.preload中查找加载器。

第二个搜索器(把模块)作为Lua库使用存储于package.path中的路径查找加载器。路径是由分号分隔的一系列模板(template)。对每个模板,搜索器将模板中的每个问号改为filename,后者是模块名,它的每个点号都被替换为“目录分隔符(directory separator)”(例如Unix中的/);然后它将尝试打开合成的文件名。因此,例如,如果Lua路径是字符串

对模块foo的Lua文件的搜索将尝试按顺序打开文件./foo.lua./foo.lc/usr/local/foo/init.lua

第三个搜索器(把模块)作为C库用变量package.cpath给出的路径查找加载器。例如,如果C路径是字符串

对模块foo的搜索将尝试按顺序打开文件./foo.so./foo.dll/usr/local/foo/init.so。一旦找到C库,该搜索器首先用动态链接设备链接应用和库。然后尝试在库内查找一个将用作加载器的C函数。该C函数的名字是“luaopen_”同模块名的拷贝连接得到的字符串,模块名的每个点号被下划线替换。此外,如果模块名有个连字符,它的直到(并且包括)第一个连字符的前缀被移除。例如,如果模块名是a.v1-b.c,函数名将是luaopen_b_c

第四个搜索器尝试一个一体化加载器。它在C路径中为给定模块的根名搜索库。例如,当请求a.b.c时,它将为a搜索C库。如果找到了,在其中为子模块查找打开函数;在我们的例子中是luaopen_a_b_c。利用该设备,包可以将若干C子模块打包在单个库中,其中的每个子模块持有自己的原始打开函数。


package.loadlib (libname, funcname)

把C库libname动态链接到宿主程序。在库内查找函数funcname并作为C函数返回。(所以,funcname必须遵循协议(见lua_CFunction))。

这是个低级函数。它完全绕过包和模块系统。不像require,它不执行任何路径搜索也不会自动地增加扩展名。libname必须是C库的完全文件名,如果需要还包括路径和扩展名。funcname必须是确切的C库导出的名字(依赖C编译器和链接器)。

该函数不被ANSI C支持。同样,它只在某些平台可用(Windows、Linux、Mac OS X、Solaris、BSD,以及支持dlfcn标准的其他Unix系统)。


package.path

该路径被require用来搜索一个Lua加载器。

Lua在启动时用环境变量LUA_PATH的值初始化该变量,或者如果该环境变量未定义则用定义在luaconf.h中的缺省路径。环境变量的值中的任何“;;”都被替换为缺省路径。


package.preload

用于特定模块存储加载器的表。(见require)。


package.seeall (module)

module设置元表,其__index字段引用全局变量,所以该模块继承全局变量的值。将要被用作函数module的一个选项。

5.4 – 字符串操作

该库为字符串操作提供常规函数,例如查找和抽取子串以及模式匹配。在Lua中索引字符串时,第一个字符在位置1(不像C是在0处)。索引允许为负数,被解释为从字符串末尾往回索引。因此,最后一个字符在-1位置,依此类推。

字符串库在表string内提供所有函数。它也给字符串设置元表,其中的__index字段指向string表。因此,你可以使用面向对象风格的字符串函数。例如,string.byte(s, i)可写为s:byte(i)

字符串库采取单字节字符编码方式。


string.byte (s [, i [, j]])

返回字符s[i], s[i+1], ···, s[j]的内部数字代码。i缺省为1;j缺省为i

注意数字代码不一定是跨平台可移植的。


string.char (···)

接受0获多个整数。返回一个字符串,其长度等于参数个数,其中的每个字符的内部数字代码等于相应的参数。

注意数字代码不一定是跨平台可移植的。


string.dump (function)

返回给定函数的二进制表示的字符串,之后在其上应用loadstring返回函数的拷贝。function必须是不带upvalue的Lua函数。


string.find (s, pattern [, init [, plain]])

在字符串s中查找pattern的第一个匹配。如果找到则返回它开始和结束处在s中的索引;否则,返回nil。可选的第三参数init是数字,指定从哪儿开始搜索;其缺省值是1并且可为负数。如果值作为可选的第四参数plain,则关闭模式匹配设备,所以函数执行无格式的“查找子串”操作,pattern中的字符并不被认为是“魔术的(magic)”。注意,如果给出了plain,则init也必须给出。

如果模式具有捕获(capture),则在成功的匹配中被捕获的值也在两个索引后面返回。


string.format (formatstring, ···)

返回其变长参数的格式化形式,第一个参数(必须是字符串)给出(格式)说明。格式字符串遵循同printf族标准C函数同样的规则。仅有的区别是不支持*lLnph等选项/修饰符,而且有个额外选项qq选项以可安全地为Lua解释器读取的适当形式格式化字符串:字符串被写在双引号之间,而且字符串中的所有双引号、换行、内嵌的0和反斜杠被恰当地转义。例如,调用

产生字符串:

选项cdEef, gGiouXx都预期得到数字作为参数,然而qs期望得到字符串。

该函数不接受含有内嵌的0的字符串值,除了作为q选项的参数。


string.gmatch (s, pattern)

返回一个迭代器函数,每次调用返回来自pattern的下一个捕获,从字符串s开头直到结尾。如果pattern没指定捕获则每次调用产生整个匹配。

作为例子,下面的循环

将迭代来自字符串s的所有单词,每行打印一个。下一个例子从给定的字符串收集所有的键=值对放在表中:

对于该函数,模式起始处的‘^’不能作为锚点,因为这会阻止迭代。


string.gsub (s, pattern, repl [, n])

返回s的拷贝,其中出现的所有(或前n个,如果指定)pattern被替换为repl——可以是字符串、表或函数,指定的替换串。gsub也返回出现的匹配的总数作为第二个值。

如果repl是字符串,它的值被用作替换式。字符%用作转义字符:repl中的任何形如%n的序列代表第n个捕获的子串(见下面),其中n在1和9之间。序列%0代表整个匹配。序列%%代表单个%

如果repl是表,则对于每个匹配,用第一个捕获作为键查询表;如果模式未指定捕获,则整个匹配被用作键。

如果repl是函数,则每次匹配发生时都调用该函数,并依序把所有捕获的子串作为参数;如果模式没指定捕获,则整个匹配作为单个参数。

如果表查询或函数调用返回的结果是个字符串或数字,则被用作替换串;否则,如果是falsenil,则不发生替换(即原始匹配被保持在字符串中)。

这里有一些例子:


string.len (s)

接受字符串并返回其长度。空串""长度为0。内嵌的0被计算在内,所以"a00bc00"长度为5。


string.lower (s)

接受字符串并返回其所有大写字母变为小写的拷贝。所有其他字符不变。大写字母的定义依赖于当前locale。


string.match (s, pattern [, init])

在字符串s中查找pattern的首次匹配。如果找到一个,则返回来自模式的捕获;否则返回nil。如果pattern未指定捕获则返回整个匹配。可选的第三个参数init是数字,指定从哪儿开始搜索;其缺省值是1并且可为负。


string.rep (s, n)

返回字符串sn个拷贝拼接字符串。


string.reverse (s)

返回字符串s的颠倒的字符串。


string.sub (s, i [, j])

返回s的子串,它起始于i并延续到jij可为负数。如果省略j,则它被假定为-1(同字符串长度一样)。特别地,调用string.sub(s,1,j)返回s长为j的前缀,而且string.sub(s, -i)返回s长为i的后缀。


string.upper (s)

接受字符串并返回其所有小写字母变为大写的拷贝。所有其他字符不变。小写字母的定义依赖于当前locale。

5.4.1 – 模式

字符类(Character Class):

一个字符类被用于表示一组字符。允许用下面的组合描述字符类:

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表示所有非空白符。

字母、空白和其他字符组合的定义依赖于当前locale。特别地,字符类[a-z]可能不等于%l

模式项(Pattern Item):

模式项可为

单个字符类,它匹配该类中的任意单个字符;

后跟‘*’的单个字符类,它匹配该类中的0或多个字符。这些重复项将总是匹配最长的可能序列;

后跟‘+’的单个字符类,它匹配该类中的1或多个字符。这些重复项将总是匹配最长的可能序列;

后跟‘-’的单个字符类,它也匹配该类中的0或多个字符。与‘*’不同,这些重复项将总是匹配最短的可能序列;

后跟‘?’的单个字符类,它匹配出现0或1次该类中的字符;

%n,其中n在1和9之间;这种项匹配一个等价于捕获的字符串的第n个子串(见下面);

%bxy其中xy是两个不同的字符;这种项匹配始于x终于y的字符串,并且xy对称的。这表示,如果一个人从左到右读字符串,对x计数为+1,对y计数为-1,结尾的y是第一个遇到计数为0的y 。例如,项%b()匹配带有平衡的圆括号的表达式。

模式(Pattern):

模式是一系列的模式项。在模式开头的‘^’将匹配固定在源串的开头。 在模式结尾的‘$’将匹配固定在源串的结尾。在其他位置上,‘^’和‘$’没有特殊含义,表示它们自身。

捕获(Captures):

模式可以含有括在圆括号内的子模式;它们描述捕获。当成功进行一个匹配,源串中匹配捕获的子串被存储(捕获)以便将来使用。捕获根据它们的左圆括号进行编号。例如,在模式"(a*(.)%w(%s*))"中,字符串的匹配"a*(.)%w(%s*)"的部分作为第一个捕获被存储(因此被编号为1);匹配“.”的字符被捕获并编号为2,匹配“%s*”的部分被编号为3。

作为一种特殊情况,空捕获()捕获当前字符串位置(一个数字)。例如,如果我们把模式"()aa()"用于字符串"flaaap",将有两个捕获:3和5。

模式不能含有内嵌的0。使用%z代替。

5.5 – 表操作

该库为表操作处理提供常规函数。它在表table内提供其所有函数。

表中的多数函数假定给定的表表示数组或列表。对于这些函数,当我们谈到表的“长度”时,我们意指取长操作符的结果。


table.concat (table [, sep [, i [, j]]])

给定一个数组,其所有元素是字符串或数字,返回table[i]..sep..table[i+1] ··· sep..table[j]sep的缺省值是空字符串,i的缺省值是1,j的缺省值是表的长度。如果ij大,返回空字符串。


table.insert (table, [pos,] value)

在表tablepos位置插入元素value,如果需要将其他元素上移到开放空间。pos的缺省值是n+1,其中n是表的长度(见§2.5.5),所以调用table.insert(t,x)在表t结尾插入x


table.maxn (table)

返回给定表的最大正数索引,如果没有正数索引则返回0。(该函数执行一次整个表的线性遍历来做这个工作。)


table.remove (table [, pos])

table中删除在位置pos处的元素,如果需要会下移其他元素以缩紧空格。返回被删除的值。pos的缺省值是表的长度n,所以调用table.remove(t)删除表t的最后一个元素。


table.sort (table [, comp])

table[1]table[n]将表元素排序为给定顺序的适当位置,其中n是表的长度。如果给出了comp,它必须是个函数,接受两个表元素并当第一个小于第二个时返回true(所以排序后not comp(a[i+1],a[i])将为true)。如果未给出comp,则使用标准的Lua操作符<代替。

排序算法不稳定;就是说,被指定顺序认为相等的元素可能被排序改变相对位置。

5.6 – 数学运算函数

该库是标准C数学库的接口。它在表math中提供所有函数。


math.abs (x)

返回x的绝对值。


math.acos (x)

返回x(弧度)的反余弦值。


math.asin (x)

返回x(弧度)的反正弦值。


math.atan (x)

返回x(弧度)的反正切值。


math.atan2 (y, x)

返回y/x(弧度)的反正切值,但用两个参数的正负号找到结果的象限。(它也能正确地处理x为0的情况。)


math.ceil (x)

返回大于或等于x的最小整数。


math.cos (x)

返回x(假定用弧度)反余弦值。


math.cosh (x)

返回x的双曲余弦值。


math.deg (x)

返回角x(以弧度给出)的角度值。


math.exp (x)

返回值ex


math.floor (x)

返回小于或等于x的最大整数。


math.fmod (x, y)

返回xy除的余数,向0的方向对商四舍五入。


math.frexp (x)

返回me使得x = m2ee是整数,m的绝对值在[0.5, 1)区间内(当x是0时则为0)。


math.huge

HUGE_VAL,大于或等于其他数字值。


math.ldexp (m, e)

返回m2ee应为整数)。


math.log (x)

返回x的自然对数。


math.log10 (x)

返回x以10为底的对数。


math.max (x, ···)

返回其参数中的最大值。


math.min (x, ···)

返回其参数中的最小值。


math.modf (x)

返回两个数,x的正数部分和小数部分。


math.pi

pi


math.pow (x, y)

返回xy。(也能用表达式x^y计算该值。)


math.rad (x)

返回角x(以角度给出)的弧度值。


math.random ([m [, n]])

该函数是ANSI C提供的简单的伪随机产生器函数rand的接口。(不担保其统计特性。)

当不带参数调用时,返回[0,1)区间内的一致的伪随机实数。当带一个整数m调用时,返回[1, m]区间内的一致的伪随机实数。当带两个整数mn调用时,返回[m, n]区间内的一致的伪随机实数。


math.randomseed (x)

设置x为伪随机产生器的“种子”:相等的种子产生相等的数字序列。


math.sin (x)

返回x(假定用弧度)的正弦值。


math.sinh (x)

返回x的双曲正弦值。


math.sqrt (x)

返回x的平方根。(也能用表达式x^0.5计算该值。)


math.tan (x)

返回x(假定用弧度)的正切值。


math.tanh (x)

返回x的双曲正切值。

5.7 – 输入输出设备

I/O库提供两种不同风格的文件处理。第一种使用隐式文件描述符;即提供操作设置缺省的输入文件和缺省的输出文件,并且所有输入/输出操作都用在这些缺省文件上。第二中风格使用显式的文件描述符。

当使用隐式文件描述符时,所有操作通过表io提供。当使用显式文件描述符时,操作io.open返回一个文件描述符,然后所有操作作为它的方法提供。

io也提供三个预定义的文件描述符,具有来自于C的通常含义:io.stdinio.stdoutio.stderr。I/O库从不关闭这些文件。

除非另作说明,否则所有I/O在函数失败时返回nil(以及一条错误消息作为第二结果和一个依赖系统的错误代码作为第三结果)并在成功时返回不同于nil的某个值。


io.close ([file])

相当于file:close()。不带file则关闭缺省的输出文件。


io.flush ()

相当于file:flush,作用于缺省得输出文件。


io.input ([file])

用文件名调用时,它打开该命名文件(以文本模式),并设置其句柄为缺省的输入文件。用文件句柄调用时,它只是设置该文件句柄为缺省的输入文件。不带参数调用时,它返回当前的缺省的输入文件。

在错误的情况下,该函数抛出错误而不是返回错误代码。


io.lines ([filename])

以读取模式打开给定的文件名并返回一个迭代函数,每次调用会返回来自文件的新行。因此,结构

会迭代文件的所有行。当迭代函数监测到文件结尾时,返回nil(以结束循环)并自动关闭文件。

调用io.lines()(不带参数)等价于io.input():lines();即迭代缺省输入文件的所有行。该情况下当循环结束时不会关闭文件。


io.open (filename [, mode])

该函数以字符串mode指定的模式打开文件。它返回新文件句柄,或者错误时返回nil以及一条错误消息。

mode字符串可为下面的任意一个:

“r”: 读模式(缺省);

“w”: 写模式;

“a”: 附加模式;

“r+”: 更新模式,保留所有以前的数据;

“w+”: 更新模式,擦除所有以前的数据;

“a+”: 附加更新模式,保留所有以前的数据,只允许在文件结尾写。

mode字符串也可在结尾有个‘b’,在某些系统中需要它以二进制模式打开文件。该字符串恰是用在标准C函数fopen中的。


io.output ([file])

类似io.input,但操作的是缺省输出文件。


io.popen (prog [, mode])

在独立进程中打开程序prog并返回文件句柄,可用它从该程序中读取数据(如果mode"r",缺省)或向该程序写入数据(如果mode"w")。

该函数是系统依赖的而且并非可用于所有平台。


io.read (···)

等价于io.input():read


io.tmpfile ()

返回一个临时文件的句柄。该文件以更新模式打开,并在程序结束时自动删除。


io.type (obj)

检查obj是否可用的文件句柄。如果是打开的文件句柄则返回字符串"file",如果是已关闭的文件句柄则返回"closed file",或者如果不是文件句柄则返回nil


io.write (···)

等价于io.output():write


file:close ()

关闭file。注意,当其句柄被垃圾收集时,文件被自动关闭,但那需要不可预知的漫长时间才会发生。


file:flush ()

把任何已写数据存入file


file:lines ()

返回迭代器函数,每次调用返回来自文件的新行。因此,结构

会迭代文件的所有行。(与io.lines不同,当循环结束时该函数不会关闭文件。)


file:read (···)

依照给定格式读取文件file,该格式制定要读取什么。对于每种格式,该函数返回读取得字符串(或数字),或者如果不能读取指定格式的数据则返回nil。当不带格式调用时,它用读取整个下一行的缺省格式(见下面)。

可用格式是

“*n”: 读取一个数字;这是返回数字而非字符串的唯一格式。

“*a”: 从当前位置开始读取整个文件。在文件结尾时返回空串。

“*l”: 读取下一行(跳过行尾),在文件结尾时返回nil。这是缺省格式。

number: 读取字符串直到该数量的字符串,在文件结尾时返回nil。如果数字是0,它什么也不读并返回空串,或在文件结尾时返回nil


file:seek ([whence] [, offset])

设置和获取由文件开头开始量度的文件位置,目标位置由offset加字符串whence指定的基点给出。如下:

“set”: 基点是位置0(文件开头);

“cur”: 基点是当前位置;

“end”: 基点是文件结尾;

成功返回由文件开头开始量度以字节为单位的最终文件位置。失败则返回nil以及一个描述错误的字符串。

whence的缺省值是"cur"offset是0。因此调用file:seek()返回当前文件位置而不改变它;调用file:seek("set")设置位置到文件开头(并返回0);调用file:seek("end")设置位置到文件结尾,并返回其尺寸。


file:setvbuf (mode [, size])

设置输出文件的缓冲模式。有三种可用模式:

“no”: 无缓冲;任何输出操作的结果立刻出现。

“full”: 完全缓冲;只在缓冲区满时(或者当你显式flush文件(见io.flush))执行输出操作。

“line”: 行缓冲;缓冲输出直到输出了换行或有来自某些特定文件(例如终端设备)的任何输入。

对于最后两种情况,size指定缓冲区大小,以字节为单位。缺省是个适当的大小。


file:write (···)

将每个参数的值写入file。参数必须是字符串或数字。要写其他值,在write之前使用tostringstring.format

5.8 – 操作系统设备

该库通过表os实现。


os.clock ()

返回程序已用的CPU时间的近似值,以秒为单位。


os.date ([format [, time]])

返回含有日期和时间的字符串或表,依据给定字符串format格式化。

如果存在参数time,这是要被格式化的时间(对该值的描述见os.time函数)。否则,date格式化当前时间。

如果format以‘!’开头,则日期被格式化为CUT(Coordinated Universal Time)。在该可选的字符后,如果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返回一个合理的日期和时间表示,依赖于主机系统和当前locale(就是说,os.date()等价于os.date("%c"))。


os.difftime (t2, t1)

返回从时间t1到时间t2的秒数。在POSIX、Windows和一些其他系统中,该值恰是t2t1


os.execute ([command])

该函数等价于C函数system。它传入command给操作系统的shell执行。它返回一个依赖系统的状态码。如果省略command,则如果shell可用会返回非0值否则返回0。


os.exit ([code])

调用C函数exit结束宿主程序,可带个可选的codecode的缺省值是成功代码。


os.getenv (varname)

返回进程环境变量varname的值,如果变量未定义则返回nil


os.remove (filename)

删除给定名字的文件或目录。要删除的目录必须为空。如果失败,该函数返回nil以及一条描述错误的字符串。


os.rename (oldname, newname)

把名为oldname文件或目录重命名为newname。如果失败,该函数返回nil以及一条描述错误的字符串。


os.setlocale (locale [, category])

设置程序的当前locale。locale是个指定区域的字符串;category是可选的字符串,描述了要变更哪个类别:"all""collate""ctype""monetary""numeric""time";缺省 category 是"all"。函数返回新locale的名字,如果请求不被认可则返回nil

如果locale是空字符串,当前locale被设为定义了本地locale的实现。如果locale是字符串“C”,当前locale被设为标准的C locale。

当以nil作为第一参数调用时,该函数只返回给定类别的当前locale的名字。


os.time ([table])

当无参调用时返回当前时间,或者返回表示了给定表指定的日期和时间的时间。该表必须具有字段yearmonthday,并且可以具有字段hourminsecisdst(对于这些字段的描述,见os.date函数)。

返回值是个数字,它的含义依赖于你的系统。在POSIX、Windows和某些其他系统中,该数计数自某个给定起始时间(epoch)以来的秒数。在其他系统中,含义是未指定的,而且time返回的数字只能用作datedifftime的参数。


os.tmpname ()

返回一个带文件名的字符串,该名字可被用于临时文件。文件在使用前必须显式地打开,并且必须在不再需要时显式地删除。

在某些系统上(POSIX),该函数也创建那个名字的文件以避免安全风险。(其他人可能在获取名字和创建文件之间的时间内创建带有错误权限的该文件。)你还必须打开该文件来使用它以及删除它(即使你没用它)。

如果可能,你也许更喜欢使用io.tmpfile,它在程序结束时自动删除文件。

5.9 – 调试库

该库向Lua程序提供调试接口功能。使用该库时你应该异常小心。这儿提供的函数应该专门用于调试和类似的任务,比如profiling。请忍住把它们用作一般编程工具的诱惑:它们非常的慢。而且,这些函数中的一些违反了关于Lua代码的某些假定(例如,函数的局部变量不能从外面访问,或者,用户数据的元表不能被Lua代码改变)并且因此会损害其他的安全代码。

该库的所有函数在表debug中提供。所有操作一个线程的函数具有可选的第一参数,它是被操作的线程。缺省总是当前线程。


debug.debug ()

进入同用户的交互模式,运行用户输入的每个字符串。使用简单的命令和其他调试设备,用户能够检查全局和局部变量,改变它们的值,计算表达式,等等。只含有单词cont的行终止该函数,这样调用者继续它的执行。

注意,debug.debug的命令不是任何函数的内部词汇,因此没有对本地变量的直接访问。


debug.getfenv (o)

返回对象o的环境。


debug.gethook ([thread])

返回线程的当前hook设定,作为三个值:当前hook函数、当前hook掩码和当前hook计数(由函数debug.sethook设置)。


debug.getinfo ([thread,] function [, what])

返回带有函数信息的表。你可直接给出函数,或者给出一个数字作为function的值,它表示给定线程的调用栈中运行于级别function的函数:级别0是当前函数(getinfo自己);级别1是调用getinfo的函数;以此类推。如果function是个比活动的函数数量大的数字,则getinfo返回nil

返回的表可包含lua_getinfo返回的所有字段,字符串what描述要填充的字段。what默认获取所有可用信息,除了有效行的表。如果提供,选项‘f’增加名为func的字段,值为函数自己。如果存在,选项‘L’增加名为activelines的字段,值为有效行的表。

例如,表达式debug.getinfo(1,"n").name返回一个表,其中含有当前函数的名字——如果可以找到合理的名字;表达式debug.getinfo(print)返回带有函数print的所有可用信息的表。


debug.getlocal ([thread,] level, local)

该函数返回栈中level级处的函数的索引为local的局部变量的名字和值。(第一个参数或局部变量索引为1,以此类推,直到最后一个活动的局部变量。)如果没有给定索引的局部变量,该函数返回nil,并且当以超出范围的level调用时抛出错误。(可调用debug.getinfo来检查级别是否有效。)

以‘(’(开圆括号)开头的变量名表示内部变量(循环控制变量、临时变量和C函数局部变量)。


debug.getmetatable (object)

返回给定对象object的元表,或者如果没有元表返回nil


debug.getregistry ()

返回注册表(见§3.5)。


debug.getupvalue (func, up)

该函数返回函数func的索引为up的upvalue的名字和值。如果没有给定索引的upvalue则返回nil


debug.setfenv (object, table)

设置给定object的环境为给定的table。返回object


debug.sethook ([thread,] hook, mask [, count])

设置给定函数作为hook。字符串mask和数字count描述hook何时被调用。字符串掩码可具有下面带有给定含义的字符:

"c": 每次Lua调用函数时hook被调用;

"r": 每次Lua从函数返回时hook被调用;

"l": 每次Lua进入代码的新行时hook被调用。

带非0的count时,hook在每count条指令后被调用。

当无参调用时,debug.sethook关闭hook。

当hook被调用时,其第一参数是描述触发其调用的事件的字符串:"call""return"(或"tail return",当模拟从尾调用中返回时)、"line""count"。对于行事件,hook也获得新行数为其第二参数。在hook内部,你可以级别2调用getinfo来获得正运行的函数的信息(级别0是函数getinfo并且级别1是hook函数),除非事件是"tail return"。该情况下,Lua只是模拟返回,而且调用getinfo将返回无效数据。


debug.setlocal ([thread,] level, local, value)

该函数把栈中level级函数中索引为local的局部变量赋值为value。如果没有给定索引的局部变量则返回nil,并且当以超出范围的level调用时抛出错误。(你可调用getinfo检查级别是否有效。)否则返回局部变量的名字。


debug.setmetatable (object, table)

设置给定object的元表为给定table(可为nil)。


debug.setupvalue (func, up, value)

该函数给func函数中索引为up的upvalue赋值value。如果没有给定索引的upvalue则返回nil。否则返回upvalue的名字。


debug.traceback ([thread,] [message] [, level])

返回带有调用栈的回溯的字符串。可选的字符串message被附加到回溯的开头。可选的数字level表明在哪个级别开始回溯(缺省是1,调用traceback的函数)。


乐趣公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Lua 5.1 基础函数
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址