Lua学习笔记:Lua基础语法
前言
虽然接触Lua已经很久了但是一直以来也没有做很完整的笔记,以至于长时间不用就会容易生疏,所以做一下笔记以便以后拿出来翻阅。
初始Lua
- 第一次接触Lua感觉这玩意的语法和python、js很像,解释型语言、弱类型等等,写起来是真省心,维护起来是真费事…
- 作为游戏的脚本热更起来是真舒服,有问题抛一个AB包搞定。
基本语法
变量
- 只有布尔、字符串、数字、table和nil。但是没有一个明确的类型定义,完全按照赋值来进行推断是什么类型。
- 默认是public,如果想private需要变量前加local。
-
可以一次性多复制,如果变量和值不对称,没有复制的变量为nil。(如下)
1 2 3 4 5 6 7 8 9
a,b,c = 1,2
print(a)
print(b)
print(c)
1
2
nil
-- 要想不为空必须对等赋值:a,b,c = 1,2,3
—|—
作用域
-
在Lua中一个local的作用域可以是一个循环、一个table(和c#中的class类似)、也可以是一个 do end,是如果你想控制一个local变量的值作用域某个区间,那么可以使用do end来明确划分一个block。如下,第一段代码print(a)结果为空,因为a是local并且作用域是do end,第二段代码因为外部有全局的a变量,所以可以打印出10
1 2 3 4
do
local a = 1
end
print(a) -- 结果为nil
—|—
1
2
3
4
5
6
a = 10
do
local a = 1
print(a)
end
print(a) -- 结果为1 10
—|—
循环 forwhile dorepeat until
-
需要注意的是for循环默认是从1开始的,这个很不爽容易造成我们写程序误判,尤其是c#和lua交互的时候需要注意
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
local ta = {1,2,3,4,5}
for i = 1, #ta do
print(i) -- 结果 1 2 3 4 5
end
```
``` lua
-- 循环从0开始的示例
local ta = {1,2,3,4,5}
for i = 0, #ta do
print(i) -- 结果 0 1 2 3 4 5
end
```
- **while do**
``` lua
a=10
while( a < 20 )
do
print("a 的值为:", a)
a = a+1
end
-- a 的值为: 10 a 的值为: 11 ..... a 的值为: 19
—|—
-
repeat…until 循环语句不同于 for 和 while循环,for 和 while 循环的条件语句在当前循环执行开始时判断,而 repeat…until 循环的条件语句在当前循环结束后判断。
1 2 3 4 5 6
a = 10
repeat
print("a的值为:", a)
a = a + 1
until( a > 15 )
-- a的值为: 10 a的值为:11 ..... a的值为:15
—|—
迭代
- lua中除了for循环还可以用迭代,需要注意pairs 和 ipairs异同
相同:都是能遍历集合(表、数组)
不同:ipairs
仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key。
pairs
能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
local tabFiles = {
[1] = "test2",
[6] = "test3",
[4] = "test1"
}
for k,v in ipairs do
print(k.."---"..v)
end
-- 结果 程序会在test2处断开
for k,v in pairs do
print(k.."---"..v)
end
-- 结果会输出 1---test2 6---test3 4---test1
—|—
table
终于写到强大的table了,table是lua中的数据结构,可以用来做数组、字典、还可以用来模拟类等等
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
table是不固定大小的,可以根据需要进行扩容
数组
1
local arry = {1,2,3} -- 下标是从1开始的
—|—
字典
1
local dic = {name = "小明",sex = "男"}
—|—
table容易出现的问题
1
2
3
4
5
6
7
8
9
10
temp = 1
tab = {[temp] = 1, 11}
print(tab[1])
for i,v in pairs(tab) do
print(i,v)
end
-- 输出的结果是 :
11
1 11
—|—
why?第一个print中为何结果不是1,因为tab[]这个用法的参数是key,而像11这样没有显示定义key的value默认的key就是1,所以这句话认为是输出key=1的value了。而且从遍历看居然只有一个数据,也就是说value
1的数据被替换掉了。
所以使用table这种数据结构时注意下面几点:
-
所有元素之间,总是用逗号 “,” 隔开;
-
所有索引值都需要用 “[“和”]”括起来;如果是字符串,还可以去掉引号和中括号; 即如果没有[]括起,则认为是字符串索引
-
如果不写索引,则索引就会被认为是数字,并按顺序自动从 1往后编;
函数
-
function可以返回也可以不返回结果,在定义时没有明确的约束。
-
支持多返回值。
-
Lua函数不支持参数默认值,可以通过or来实现。
1 2 3 4 5 6 7
function (a , b)
a = a or 1.1
b = b or 2.2
return a + b
end
print(sum())
—|—
-
支持闭包
1 2 3 4 5 6 7 8 9 10 11 12 13
tab = {1,2,3,4,5,6,7,8}
function iter()
local index = 0
return function()
index = index + 1
return tab[index]
end
end
for i in iter() do
print(i)
end
—|—
-
支持可变参数
1 2 3 4 5 6 7 8 9 10
function average(...)
result = 0
local arg={...}
for i,v in ipairs(arg) do
result = result + v
end
print("总共传入 " .. #arg .. " 个数")
return result/#arg
end
print("平均值为",average(10,5,3,4,5,6))
—|—
:和.的区别
这个也是很多接触lua的新手容易迷惑的地方,其实:是个语法糖,调用的函数会自动传递参数self
1
2
3
4
5
6
7
8
9
10
11
12
local a = {x = 0}
function a.foo(self, a)
self.x = a
end
function a:foo(a)
self.x = a
end
-- 调用时
a.foo(a, 2)
a.foo2(2)
—|—