Lua学习二

本文介绍了Lua中函数的特性,如作为变量、函数定义、表排序的实现、格式化输出、局部函数声明和递归。此外,还讨论了尾调用优化、迭代器、闭包的概念,以及Lua的for循环、dofile与loadfile的区别,以及如何处理异常信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.对于Lua而言,函数其实也是一种变量,故而系统的函数名实际上也是一种变量名:

a={p=print}

a.p("good")

输出good

2.函数定义,实际上是将一个类型为function的变量(整个函数chunk)赋值给一个自定义变量

3.Lua的表构造提供了一个排序函数,可以对一个表进行排序,table.sort(t,function(a,b)),此函数接受两个参数,第一个是待排序的表,而第二个则是排序规则说明的函数,此类以函数作为参数的函数称之为高级函数,在此例中,函数参数只需返回给定a,b参数对应的表t元素的比较规则,即大小关系即可

4.Lua的格式化输出,需要借用上篇提到的string.format函数:

print(string.format("%d,%d",y,x))

5.Lua普通声明得到的函数时全局函数,而同时,Lua也提供了局部函数的声明方式:

1).声明在表中的函数:

Lib{]; function Lib.foo()...end;

Lib{foo = function()...end...}

Lib{}; Lib.foo = function()...end

2).直接声明的局部函数:local f = function() ... end

3).local function f()...end

6.Lua中函数可以定义成递归的,就跟普通语言中一样,不过如果是想将局部函数定义成递归的,却需要事先声明,否则递归函数在执行过程中进行查找的话,将不能查找到自身,这样就会导致错误

7.当函数最后一个语句是调用其他函数,即return g()时,我们称之为尾调用,由于尾调用结束之后不需要再返回调用函数,故而不需要占用任何栈空间,故而,如果递归进行尾调用,理论上来说,调用层次是不受限制的,即无论调用多少次都不会导致栈溢出,很多情况下形式很像的调用不是尾调用,如
return (g(x))

return g(x)+1

g(x);return

8.Lua创建迭代器:

function test()

i = 0

return function()

i = i+1

return i

end

end

n = 6

j = 0

t = test()

while j < n do

print(t()) --因为test的返回值是一个函数,即t是一个函数,故而调用的时候需要添加括号,而print的结果却是1,2,3,4,5,6

j = j+1

end

在此程序中之所以实现了迭代,是因为在函数test中定义的函数能够访问到test函数中定义的变量i,而一次次的调用完成了对i的修改,故而每次调用的结果是不

同的,变量i被称为函数test的upvalue,而此upvalue和test内嵌的函数(实际上还包括test函数,也就是产生闭包的工厂函数)构成了闭包,这是Lua中的一个非常强大的功能,详情参见:http://www.cnblogs.com/elvisxu/archive/2011/07/19/2110063.html

9.范性for循环:

for line in io.lines() do

io.write(line,'\n')

end

此类循环的执行过程如下:

1).首先,初始化,先计算in后面的表达式的值,通常此类表达式会返回三个参数,分别是迭代函数,状态常量以及控制变量

2).其次,将状态常量和控制变量用作迭代函数的参数对迭代函数进行调用

3).接着,将迭代函数调用完毕后的返回值返回给变量列表,也就是in前面的列表

4).如果返回的列表的第一个值是nil,循环结束,否则执行循环体

5).将返回列表的第一个值替换控制变量,重复2~5步

10.dofile执行文件实际上是借助loadfile完成的,loadfile读取并编译文件完成函数定义但不执行(即函数此刻并未定义,只有当运行函数时定义才初完成),也只是返回错误码和nil却不报错,同时只需编译一次即可执行多次,而dofile不同,每次都要编译并执行,而且是直接报错

11.与loadfile对应的,还有一个loadstring,这个跟loadfile功能相近,不同的是,直接从字符串中读取:

f=loadstring("i=i+1")

上面这个语句执行后,每次执行f()都相当于完成了string中的相应语句功能,load的两个语句其实实际上就相当于载入了一个chunk,可以看成是一个匿名的函数,所以如果chunk中有返回值,也不用大惊小怪,不过在上面的赋值式子中,f还依然相当于函数,而非返回值

12.Lua中处理异常信息的方式是调用pcall函数:

if pcall(f()) then --正确运行

...

else --异常处理

...

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值