一、变量
变量在使用前,需要在代码中进行声明,即创建该变量。
编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。
Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,哪怕是语句块或是函数里,除非用 local 显式声明为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束。
变量的默认值均为 nil。
#!/usr/local/bin/lua a = 1 -- 全局变量 local b = 2 -- 局部变量 function fun() c = 3 -- 全局变量 local d = 4 -- 局部变量 end fun() print(c, d) -- 3 nil do local a = 5 -- 局部变量 b = 6 -- 对局部变量重新赋值 print(a, b) -- 5 6 end print(a, b) -- 1 6
二、赋值语句
赋值是改变一个变量的值和改变表域的最基本的方法。
Lua 可以对多个变量同时赋值。
当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
- 变量个数 > 值的个数 按变量个数补足nil
- 变量个数 < 值的个数 多余的值会被忽略
#!/usr/local/bin/lua a = 1 b = "ABC" print(a, b) -- 1 ABC a = a + 1 b = "A" .. "BCD" print(a, b) -- 2 ABCD c, d = 1, "2" .. "3" print(c, d) -- 1 23 a, b = 1, 2, 3 print(a, b) -- 1 2 a, b, c = "A", "B" print(a, b, c) -- A B nil
应该尽可能的使用局部变量,有两个好处:
- 避免命名冲突。
- 访问局部变量的速度比全局变量更快。
三、索引
对 table 的索引:[]
、 .
t[i] t.i -- 当索引为字符串类型时的一种简化写法 gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用
四、循环语句
Lua 语言提供了以下几种循环处理方式:
1. while
i = 10 while(i >= 1) do print(i) i = i - 1 end
2.for
Lua 编程语言中 for语句有两大类:
- 数值for循环
- 泛型for循环
1. 数值for循环
for var = exp1, exp2, exp3 do <执行体> end
var 从 exp1 变化到 exp2,每次变化步长为 exp3(默认1)。
function fun(x) return x - 1 end x = 3 for i = 1, fun(x) do print(i)
for的三个表达式在循环开始前一次性求值,以后不再进行求值。
2. 泛型for循环
泛型 for 循环通过一个迭代器函数来遍历所有值。
a = {1, 2, 3} for i, v in ipairs(a) do print(i, v) end
3.repeat…until
repeat…until 循环的条件语句在当前循环结束后判断。 (do-while)
x = 3 repeat print(x) x = x - 1 until(x == 0)
4.循环嵌套
三种循环都可以相互嵌套
五、循环控制语句
Lua 支持以下循环控制语句:
1.break
x = 3 repeat print(x) x = x - 1 if (x == 1) then break end until(x == 0)
运行结果:
3 2
2.goto
Label: ::Label:: local a = 1 ::label:: print("--- goto label ---") a = a + 1 if a < 3 then goto label -- a 小于 3 的时候跳转到标签 label end
实现 continue
方法一,在循环的内部再嵌入一层循环:
table = {1, 2, 3, 4, 5} for i = 1, #table do while true do -- 内层循环 if table[i] % 2 == 0 then break end print(table[i]) break -- 正常逻辑也需要break,否则会进入死循环 end end
方法二,使用goto语句:
table = {1, 2, 3, 4, 5} for i = 1, #table do if table[i] % 2 == 0 then goto continue end print(table[i]) ::continue:: end
方法三,使用repeat语句:
table = {1, 2, 3, 4, 5} for i = 1, #table do repeat if table[i] % 2 == 0 then break end print(table[i]) until true end