lua程序设计(2) - 语句和函数

2013-03-09 18:06

lua程序设计(2) - 语句和函数

by snoopyxdy

at 2013-03-09 10:06:50

original http://snoopyxdy.blog.163.com/blog/static/601174402013124416382

1、lua允许多重赋值
a,b = 10, 2*x

2、交换x和y的值
x,y = y,x

3、如果多重赋值等号左边的变量名多余右边的值,则右边的少于左边的值会以nil代替,反之右边多余的值会被去掉
例如:
a,b,c = 0;
print(a,b,c)  -- 0,nil,nil
a,b,c = 0,0,0
print(a,b,c)  -- 0,0,0

4、一般多重赋值用来接收函数的2个返回值,比如:
a,b = f()
则a和b分别被赋值了函数f的返回值

5、全局变量和局部变量
j = 10 -- 全局变量
local i = 1 -- 局部变量
局部变量仅作用于声明它的那个块,一个块是一个程序体,例如下面,从while到end是一个程序块
x=10
local i =1
while i <= x
do
local x = i*2
print(x)
i = i + 1
end

6、显示的声明一个程序块
do
 local a = 1
 local b = 2
end

7、一个局部变量和局部变量同名的例子:
local a,b = 1,10
if a<b then
print(a)  -- 1
local a    
print(a)   --nil
end
print(a,b)   -- 1  10

8、在lua中有一种书写习惯
local foo = foo
利用全局变量赋值给局部变量可以暂存全局变量而且会加速程序

9、if语句,lua不支持switch语句
if op == '+' then
r=a+b
elseif op == '-' then
r=a-b
else
r=a*b
end

10、while语句
如果条件为假则循环结束,否则一直执行下去
local i = 1
while a[i] do
print(a[i])
i = i + 1
end

11、repeat until至少执行循环一次
repeat
line = io.read()
until line ~= ""

12、for循环
for var=exp1,exp2,exp3
<执行体>
end
var从exp1变化到exp2,每次步长为exp3,exp3是可选的,默认为1
注意i是局部变量,所以在循环体外去读取循环变量会出现错误
例如
for i=1,10 do
print(i)
end
max = i  --错误!

13、for迭代器
a={x=1,y=2;3,4,5}
for i,v in ipairs(a) do
print(i,v)
end
这里将只叠代a表格数组部分,结果为
1 3
2 4
3 5

14、for迭代器2
a={x=1,y=2;3,4,5}
for i,v in pairs(a) do
print(i,v)
end
这里将叠代所有atable的key和value,结果为
1 3
2 4
3 5
y 2
x 1

15、return和break
break用于跳出循环
return用于跳出函数

16、一个简单的函数例子
function add(a)
local sum=0
for i,v in ipairs(a) do
sum = sum + v
end
return sum
end

17、函数多重返回值
return a,b
这样就可以返回多个值

18、可以讲函数放入一个圆括号中,迫使它只返回一个值

19、unpack
x = {1,2,3,4}
print(unpack(x))
a,b,c,d = unpack(x)
print(a,b,c,d)
结果为:
1 2 3 4
1 2 3 4

20、变长参数
function add(...)
local s=0
local a,b = ...  -- 获得可变参数的前2个
print(a,b)
for i,v in ipairs({...}) do
s = s + v
end
return s
end

print(add(3,4,10,25,12))

21、select选择器
select('#', ...) 返回可变参数的长度总数
select(i, ...)  返回可变参数的第i个参数

22、当参数为一个table时,函数调用的圆括号是可有可无的
rename{old="temp.lua", new="temp1.lua"}

23、异常try catch使用 pcall
local status, err = pcall(function() error({code=121}) end)

24、throw 异常使用error函数
function foo(str)
    if type(str) ~= "string" then
        error("string expected")
    end
...
end

25、print(debug.traceback())
独立的Lua解释器用来构建错误信息的函数就是debug.traceback。你可以在任何时候调用debug.traceback获取当前运行状况的跟踪信息