深入浅出游戏算法(3)-lua脚本(7)

此外,函数本身也是一个变量,比如:

dp@dp:~ % cat test.lua

local mylen={}

mylen.len3=function (x,y,z)

return math.sqrt(x*x+y*y+z*z) 

end

mylen.len2=function (x,y)

return math.sqrt(x*x+y*y) 

end

print(mylen.len2(10,9))

print(mylen.len3(10,9,-9))

dp@dp:~ % 

dp@dp:~ % lua test.lua

13.453624047074

16.186414056239

dp@dp:~ % 

可以定义闭包,将一个函数写在另一个函数之内,定义在内部的函数可以访问外部函数的局部变量,lua中称之为closure:

dp@dp:~ % cat test1.lua

function mysum(i)

local sums=0

return function()

sums=sums+i

return sums

end

end

my_sum=mysum(2)

print(my_sum())

print(my_sum())

print(my_sum())

my_sum=mysum(9)

print(my_sum())

print(my_sum())

print(my_sum())

dp@dp:~ % lua test1.lua

2

4

6

9

18

27

dp@dp:~ % 

麦好的AI乐园博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/


可以使用loadfiledofile将整个lua代码做为函数来执行:

> dofile("test1.lua")

2

4

6

9

18

27

> dofile("test.lua")

13.453624047074

16.186414056239

> myf=loadfile("test.lua")

> myf()

13.453624047074

16.186414056239

也可以通过loadstring定义一段语句

然后将这段语句做为一个函数执行

> myf=loadstring("x=x*2")

> x=10

> myf()

> print(x)

20

> myff=loadstring("x=io.read();x=x+2;print(x)")

> myff()

234

236

检查条件,触发错误

dp@dp:~ % cat mysum.lua

mysum=0

while true do

print("请输入一个数(输入0退出计算)")

num=assert(io.read("*number"),"非数字输入")

print(num)

if num==0 then break end

end

dp@dp:~ % 

dp@dp:~ % lua mysum.lua

请输入一个数(输入0退出计算)

asdf

lua: mysum.lua:4: 非数字输入

stack traceback:

[C]: in function 'assert'

mysum.lua:4: in main chunk

[C]: in ?

dp@dp:~ % 

mysum=0

while true do

print("请输入一个数(输入0退出计算)")

num=io.read("*number")

if not num then error("非数字输入") end

print(num)

if num==0 then break end

End

运行后,输入非数字会触发错误而退出

dp@dp:~ % lua mysum1.lua

请输入一个数(输入0退出计算)

1342

1342

请输入一个数(输入0退出计算)

asf

lua: mynum1.lua:5: 非数字输入

stack traceback:

[C]: in function 'error'

mynum1.lua:5: in main chunk

[C]: in ?

dp@dp:~ % 

也可使用pcall调用可能发生错误的函数,然后进一步处理错误

my_sum=0

function mysum()

while true do

        print("请输入一个数(输入0退出计算)")

        num=io.read("*number")

        if not num then error("非数字输入") end

        if num==0 then break end

        my_sum=my_sum+num

end

end

if pcall(mysum) then

    print("计算完毕,累加结果:"..my_sum)

else

    print("只能输入数字,程序异常退出!")

    print("累加结果:"..my_sum)

end

dp@dp:~ % lua mysum.lua

请输入一个数(输入0退出计算)

234

请输入一个数(输入0退出计算)

-324

请输入一个数(输入0退出计算)

88

请输入一个数(输入0退出计算)

123

请输入一个数(输入0退出计算)

0

计算完毕,累加结果:121

dp@dp:~ % lua mysum.lua

请输入一个数(输入0退出计算)

234

请输入一个数(输入0退出计算)

-11

请输入一个数(输入0退出计算)

233

请输入一个数(输入0退出计算)

88

请输入一个数(输入0退出计算)

asdf

只能输入数字,程序异常退出!

累加结果:544



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值