1.局部变量

局部变量的声明关键字:local.

局部变量的作用域是声明块,指的是函数体,或者是一个chunk。

例子:

local a,b=1,10 if a<b then 	print(a) 	local a 	print(a) end print(a,b)



可以用do..end语言来控制局部变量的作用域,例如求解二元一次方程二元一次:

a,b,c=1,4,1 do 	local a2=2*a 	local delta=(b^2-4*a*c)^(1/2) 	x1=(-b+delta)/a2 	x2=(-b-delta)/a2 end print(x1,x2)

a2和delta都声明为局部变量,在chunk运行结束之后思动销毁。

在Lua中应当尽可能地去使用local声明,因为:

1)可以不影响全局成员的情况下重复使用变量名;

2)使用局部变量会更快一些;

3)当局部变量的chunk代码执行完毕,局部变量就会自动释放被占用的内存。

还有一个常用的用法就是:

local foo=foo

这样做的用处是:保护全局变量不被修改;快速访问。


2.流程控制

首先要注意一点:除nil和false之外的所有值在判断中都为真,包括0和空字符。

lua中的流程控制主要包括if,while,repeat,各举一例。

if,简单的计算器

print("Input a Formula with two number:") s=io.read() a=string.sub(s,1,1) b=string.sub(s,3,3) op=string.sub(s,2,2)  if op == "+" then r = a + b elseif op == "-" then r = a - b elseif op == "*" then r = a*b elseif op == "/" then r = a/b else error("invalid operation") end print(s.."="..r)

while,遍历数组求最大值
a={3213,132,25} local i=1 max=a[1] repeat 	print(a[i]) 	if max<a[i] then max=a[i] end 	i=i+1 	until a[i]==nil print("max:"..max)


repeat,改写上面的吧(感觉就是c中的do...while,先执行再判断)

a={1,23,4,45,64,2,132,25} local i=2 max=a[1] while a[i] do 	print(a[i]) 	if max<a[i] then max=a[i] end 	i=i+1 end print("max:"..max)

3.两种for循环

lua中的阿for循环有两中,numeric for 和generic for

numeric for的基本形式是:

for var=exp1,exp2,exp3 do        <something> end 
exp1是起点,exp2是终点,exp3是步长,可以不写,默认的话为1。

要注意两点:1)三个表达式都只计算一次;2)循环控制变量是局部变量,循环结束之后自动销毁;3)不要试图在循环中改变循环控制变量,结果是不可预测的;4)跳出for循环用break。

generic for是通过迭代器的方式遍历所有元素,例如打印数组:

days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} for k,v in pairs(days) do print(k..":"..v) end


下面是一个插入排序的例子:

a={2,321,23123,32,11} --for i=1,5 do --	a[i]=io.read() --end for i=1,5 do 	k=i 	for j=i+1,5 do 		if a[k]>a[j] then 		k=j 		end 	end 	tmp=a[i] 	a[i]=a[k] 	a[k]=tmp end print("After Sort:"); for i=1,#a do 	print(a[i]) end



4.break和return

break语句用来退出当前循环(for、repeat、while)。在循环外部不可以使用。
return用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return。
Lua语法要求break和return只能出现在block的结尾一句(也就是说:作为chunk的最后一句,或者在end之前,或者else前,或者until前)