首页 > 代码库 > Lua chapter 3

Lua chapter 3

1. 交换两个数值
x, y = y, x;   //等价于 x = y, y =x;

2. 变量初始化问题 
a, b, c = 0;
print(a,b,c);   --> 0  nil  nil
仅对第一个值复制,所以要初始化一组变量,应该提供多个初始值
a, b, c = 0, 0, 0;
print(a, b, c);  --> 0   0   0

3. "尽可能地使用局部变量",这是一种良好的编程风格,
   1)访问局部变量比全局更快
   2)局部变量随作用域结束而消失,这样垃圾收集器便可释放其值

4. do - end; 可以显示地定义一个代码块,相当于"{...}";

5. Lua中的一种习惯写法:
   local foo = foo;  全局赋值局部,加快当前作用域中对foo的访问

6. 控制结构
a = 10;
if a>0 then
print(">0");
else
print("<0");
end;


local i=10;
while i>0 do
print(i);
i = i -1;
end;


-- repeat 至少执行一次
repeat
line = io.read();
until line =="";
print(line);


7. for 循环:数字型 和 泛型
   数字型: for var = exp1, exp2, exp3 do ... end 
   var 从 exp1 到 exp2 ,步长为 exp3 (可选,默认为1)
   不想给循环设置上限的话,可以使用常量 math.huge
   细节:for 的3个表达式仅在循环前执行一次,其次,控制变量会被自动声明为局部变量,循环结束不再可见   
   
for i=1, math.huge do
if (i>100) then
print(i);
end;
end;

泛型for 的简单示例
-- ipairs 打印数组a的所有值
a={"Sun","Mon"}; 
for i,v in ipairs(a) do
print(v);
end;
-- i是索引值,v是i对应的元素值


-- pairs 打印key 
for k in pairs(a) do
print(k);
end;


Lua的几种常用迭代器 
迭代文件中每行的 io.lines
迭代table元素的 pairs
迭代数组元素的 ipairs
迭代字符串中单词的 string.gmatch 等等


-- for 的简单应用示例
days = {"Sun","Mon","Tue","Wed"};
现在要将一个名称转换为它在一周中的位置,一个有效的方法是创建一个 "逆向table",
普通做法是:
revDays = {["Sun"]=1, ["Mon"]=2, ["Tue"=3]...};

可以这样自动构造一个逆向table,
revDays = {};
for k,v in pairs(days) do
revDays[v] = k;
end;


8. 可以使用 break 或是 return 来结束当前的循环