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

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


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



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

> dofile("test1.lua")

> 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
请输入一个数(输入0退出计算)")
        num=io.read("*number")
非数字输入") end
        if num==0 then break end
        my_sum=my_sum+num
end
end
if pcall(mysum) then

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

else

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

累加结果:"..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