《Lua程序设计》笔记之三——标准库

18. 数学库

       数学库由算术函数的标准集合组成:三角函数(sin,cos,tan,asin,acos,etc),幂指函数(exp,log, log10),舍入函数(floor,ceil),max,min加上常量pi。

       数学库也定义了一个幂操作符(^)

       所有的三角函数都在弧度单位下工作,可以使用deg和rad函数在度和弧度之间转换。如果想在degree下使用三角函数,可以重新定义三角函数。

       localsin, asin, … = math.sin, math.asin, …

       localdeg, rad = math.deg, math.rad

       math.sin= function (x) return sin(rad(x)) end

       math.asin= function (x) return deg(asin(x)) end

      

       math.random用来产生伪随机数:

       不带参数,将产生[0,1)范围内的随机数

       带一个参数n,将产生 1<= x <= n范围内的随机数x

       带两个参数a和b,将产生 a <= x<=b范围内的随机函数x。

       使用randomseed设置随机数发生器的种子,只接受一个数字参数。可以使用当前时间作为随机种子,那么产生的序列将会不一样。math.randomseed( os.time());

 

19. table库

       table库由一些操作table的辅助函数组成,主要作用之一是对Lua的array的大小给出一个合理的解释。

       数组大小:Lua中假定array在最后一个非nil元素处结束。那么我们不能拥有nil元素。当需要array有nil元素时,需要一种方法来明确的表明array的大小

       Table库定义了两个函数操纵array的大小:getn,返回array的大小。setn,设置array的大小。

       默认的,setn和getn使用内部表存储表的大小。

 

       remove和insert

       table库提供一个从list的任意位置插入和删除元素的寒素。table.insert在array指定位置插入一个元素,并将后面所有的其他的元素后移。insert改变array的大小。

       a是一个数组{10, 20, 30},调用table.insert(a, 1, 15)后,a变为了{ 15, 10, 20, 30}。

       不带位置参数调用insert,将会在array最后位置插入元素。

       table.remove函数删除数组中指定位置的元素,并返回这个元素。后面的元素前移,并改变数组大小。

       使用这两个函数,很容易实现栈,队列,和双端队列。

      

       排序:

       排序函数 table.sort,两个元素:存放元素的array和排序函数。不提供排序函数,则默认使用小于操作符进行比较

       常见的错误是企图对下标域进行排序。在一个表中,所有下标组成一个集合,但是无序。如果想对它进行排序,必须将他们复制到一个array,然后对这个array进行排序。

       例如如下的例子,想对函数名进行排序:

lines = {
       luaH_set = 10,
       luaH_get = 24,
       luaH_present = 48,
};
 
a = {}
for n in pairs(lines) do table.insert(a, n) end
table.sort( a);
for i, n in ipairs(a) do print(n) end
      
输入结果:
luaH_get
luaH_present
luaH_set

       对于Lua来说,数组也是无序的,但是我们知道如何进行计数,只要使用排序号的下标访问数组,就可以得到排序号的函数名。ipairs使用key的顺序1,2,…,后者表的自然存储顺序。

 

20. String库

       Lua解释器对字符串的支持有限,一个程序可以穿件字符串并连接字符串,但不能截取子串,检查字符串的大小,检查字符串的内容。在Lua中操纵字符串的功能基本来自于string库。

       String库中一些函数非常简单:

string.len(s)返回字符串s的长度,string.rep(s, n)返回重复n次字符串s的串;string.lower(s)将s中的大写字母转换为小写(string.upper将小写转换成大写)。

       string.sub(s,i, j)函数截取字符串s的从第i个字符到第j个字符之间的串。字符串第一个字符索引从1开始。本函数并不会改变字符串的值,致死将变量赋给一个新的字符串。

       string.char函数和string.byte函数用来将字符在字符和数字之间转换。string.char获取0个或多个整数,将每一个整数转换成字符,然后返回所有这些字符链接起来的字符串。string.byte(s, i)将字符串s的第i个字符转换成整数。i默认值为1.

print(string.char(97));

i = 99; print(string.char(i ,i+1, i+2));

print(string.byte("abc"))

print(string.byte("abc", 2))

print(string.byte("abc", -1))

       运行结果:

a

cde

97

98

99

       使用负数索引访问字符串的最后一个字符

       函数string.format在用来对字符串格式化的时候,功能很强大。使用和C语言的printf函数几乎一模一样,完全可以参考C语言的printf来使用这个函数

      

       模式匹配函数:

       string.find字符串查找,string.gsub全局字符串, string.gfind全局字符串查找

 

       模式:

      

       捕获:

      

       转换的技巧:

      

      

21. IO库

       I/O库为文件操作提供了两种模式:简单模式拥有一个当前输入文件盒一个当前输出文件,提供针对这些文件相关的操作。

       完全模式使用外部的文件句柄来实现,以一种面向对象的形式,将所有的文件操作定义为文件句柄的方法。

       I/O库的所有函数都放在了表io中。

      

       简单I/O模式:

       简单模式的所有操作都在两个当前文件之上,I/O库将当前输入文件作为标准输入(stdin),当前输出文件作为标准输出(stdout),执行io.read就在标准输入中读入一行。可以使用io.input和io.output函数来改变当前文件。

       io.input(filename)就是打开给定文件(以读模式),并将其设置为当前输入文件。接下来的所有输入都来自于该文件,直到再次调用io.read()。io.output函数与input类似,一旦产生错误,两个函数都会产生错误。

       如果想直接控制错误,必须使用完全模式中io.read()函数。

       io.write("sin(3)= ", math.sin(3), "\n");

io.write(string.format("sin(3) = %.4f\n",math.sin(3)));

      

       输出结果:

       sin(3) = 0.14112000805987

sin(3) = 0.1411

       编写代码的时候应尽量避免io.write(a .. b .. c);这样的写法,比较耗资源。

      

       read函数从当前输入文件读取串,由它的参数控制读取的内容:

       "*all" 读取整个文件   "*line"         读取下一行

"*number"      从串中转换出一个数值       num  读取num个字符到串中

 

io.read("*all")函数从当前位置读取整个输入文件,如果当前位置在文件末尾,或者文件为空,函数将返回空串。

       io.read("*line");函数返回当前输入文件的下一行,到达文件末尾,返回值为nil

local count = 1;

while true do

       local line = io.read()

       if line == nil thenbreak end

       io.write(string.format("%6d  ", count), line, "\n");

       coun

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值