现在的位置: 首页 > 综合 > 正文

每日一Lua(2)-语句

2013年10月11日 ⁄ 综合 ⁄ 共 1780字 ⁄ 字号 评论关闭

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前)

抱歉!评论已关闭.