5.5 - 表操作
该库为表操作处理提供常规函数。它在表table
内提供其所有函数。
表中的多数函数假定给定的表表示数组或列表。对于这些函数,当我们谈到表的“长度”时,我们意指取长操作符的结果。
table.concat (table [, sep [, i [, j]]])
给定一个数组,其所有元素是字符串或数字,返回
table[i]..sep..table[i+1] ··· sep..table[j]
。
sep
的缺省值是空字符串,
i
的缺省值是1,
j
的缺省值是表的长度。如果
i
比
j
大,返回空字符串。
table.insert (table, [pos,] value)
在表table
的pos
位置插入元素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)
返回x
被y
除的余数。
math.frexp (x)
返回m
和e
使得x = m2e,e
是整数,m
的绝对值在[0.5, 1)区间内(当x
是0时则为0)。
math.huge
值HUGE_VAL
,大于或等于其他数字值。
math.ldexp (m, e)
返回m2e(e
应为整数)。
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]区间内的一致的伪随机实数。当带两个整数m
和n
调用时,返回[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.stdin
、io.stdout
和io.stderr
。I/O库从不关闭这些文件。
除非另作说明,否则所有I/O在函数失败时返回nil(以及一条错误消息作为第二结果和一个依赖系统的错误代码作为第三结果)并在成功时返回不同于nil的某个值。
io.close ([file])
相当于file:close()
。不带file
则关闭缺省的输出文件。
io.flush ()
相当于file:flush
,作用于缺省得输出文件。
io.input ([file])
用文件名调用时,它打开该命名文件(以文本模式),并设置其句柄为缺省的输入文件。用文件句柄调用时,它只是设置该文件句柄为缺省的输入文件。不带参数调用时,它返回当前的缺省的输入文件。
在错误的情况下,该函数抛出错误而不是返回错误代码。
io.lines ([filename])
以读取模式打开给定的文件名并返回一个迭代函数,每次调用会返回来自文件的新行。因此,结构
for line in io.lines(filename) do body end
会迭代文件的所有行。当迭代函数监测到文件结尾时,返回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 if obj
。
io.write (···)
等价于io.output():write
。
file:close ()
关闭file
。注意,当其句柄被垃圾收集时,文件被自动关闭,但那需要不可预知的漫长时间才会发生。
file:flush ()
把任何已写数据存入file
。
file:lines ()
返回迭代器函数,每次调用返回来自文件的新行。因此,结构
for line in file:lines() do body end
会迭代文件的所有行。(与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
之前使用tostring
或string.format
。