命名建议
- 常量用全大写和下划线,例:MY_CONSTANT
- 变量第一个字母小写,例:myVariable
- 全局变量第一个字母用小写g表示,例:gMyGlobal
- 函数名第一个字母大写,例:function MyFunction( )
- 避免使用_开头,可以将_移至末尾
- 避免与内置的_Version冲突
局部变量和全局变量
全局变量
全局变量:Lua中的变量默认是全局的。变量的值是保持不变的,除非脚本改动。
局部变量:可以给它设定一个初始值,在变量之前必须使用关键字local声明。
- 可以使用do…end来显式声明代码块
- 访问局部变量的速度快于全局变量
- local foo=foo(可以提高对foo的访问速度,在需要多次访问foo时,可加快程序速度) ```lua local myValue = 3 —声明局部变量, 并赋初始值3
—[[ 局部变量比全局变量快 —]] a = 1 local b
time1 = os.time() for i = 1, 10000000000 do a = 1 end time2 = os.time() print(time2 - time1) —输出:79
time1 = os.time() for i = 1, 10000000000 do b = 1 end time2 = os.time() print(time2 - time1) —输出:38
- 局部变量的有效范围:
```lua
function MyFunction()
local myX=7 --myX将会在函数结束时被销毁
if myX < 10 then
local myY = "hello world" --myY将会在代码块if结束后被销毁
print(myY) --输出“hello world”
end
print(myY) --输出nil,因为myY已被销毁
end
数据类型
lua中不需要指定变量的类型,
myValue = 7
Lua中有5中变量类型:nil、Boolean、string、Number、table
nil
表示变量还未被赋值。
-
Boolean
只有 true 和 false 两种值。
- number型 和 空字符串都被认为是true
- nil被认为是false
除了false和nil被认为是false,其余的都认为是true
string
包括特殊字符串(转义字符),可以小到一个字符,也可以包含百万字符。
-
Number
在Lua5.3版本后,加入了整形,所以在Lua中有整形和双精度浮点数。
- 在逻辑判断中整形和浮点型被认为是相等的
如果要知道number是整形还是浮点型,则需要用到数学库函数math.type()
Lua中table不仅可以用数值作索引,还可以用字符串或其他类型都可以作为索引
- 注:nil不可作为索引
- table要么是值要么是变量,可以看成是对象
- Lua中table是一种动态分配的对象,只能操作指向表的引用(或指针),不能进行表的复制
- 设a为table,则b=a只会给b赋上a的指针,并不是新建一个与a相同table
- Lua中table是一种动态分配的对象,只能操作指向表的引用(或指针),不能进行表的复制
- 当程序中没有引用指向该表时,垃圾处理器会释放该表所占用的内存空间 ```lua a = {} a[“X”] = 10 a[20] = “great” b=a —将table a的引用给b,这样b也同样指向该table print(b[“X”],b[20]) —输出:10 great
—表时匿名的,表本身与变量之间没有关系 a=nil —将储存a的空间释放 print(b[“X”],b[20]) —b指向的table仍然存在,输出:10 great b=nil —所有指向表的引用都被释放,则表的内存也被释放
<a name="lrSNW"></a>
### userdata
- 允许将任意C数据存储在Lua变量中,只有赋值和相等的操作
<a name="t98Dq"></a>
### type(type(X))
- 结果一定是string,因为type返回的是string
<a name="ZrDcy"></a>
###
<a name="lOn7E"></a>
# 运算符
- 一种特殊的符号,让**两个值得出运算结果**。
- 关系运算符可以得出Boolean()的结果
<a name="lXaaV"></a>
### 算数运算符
- 加:c = a + b
- 减:c = a - b
- 乘:c = a * b
- 除:c = a / b
<a name="lOVpe"></a>
### 关系运算符
- 大于:>; 大于等于:>=
- 小于:<; 小于等于:<=
- **不等于:~=(注:与别的语言不同)**
- 如果用关系运算符,**比较**两个**table**,**只有**两个**table是同一个对象**时,才能得到预期结果。(可以把table看做指针--变量只是table的引用)但是table中的**值可以直接比较**。
<a name="AGbUK"></a>
### 逻辑运算符---短路求值
- **短路求值:只在需要时,进行第二个参数的运算**
- 例:
```lua
i ~= 0 and a/i > b
--Lua不会进行除数为0的报错,因为i为0时,不会进行a/i的运算
and:与运算,第一个参数是false,则返回false,否则返回第二个参数的值。(结果不一定为Boolean)
a, b = 1, 2 print((a < b) and b) --输出结果为b print((a > b) and b) --输出结果为false
or:或运算,第一个不是false,则返回第一个参数的值。如果第二个参数是true,则返回第二个参数的值。
- 第一个为true则返回true,第一个为false则返回第二个参数
and的优先级大于or
a, b = 1, 2 print((a < b) or a) --结果为true print((a > b) or a) --结果为a print(a or b) --结果为a print((a > b) or a) --结果为a
not返回参数的相反值,结果永远是Boolen型
注:在逻辑运算过程中,可把Number型变量看做true,但不完全等于true,使用not Number则结果为false,但是在短路求值法则中,可保持原数值。
x = x or v
-
a and b or c
相当于a?b:c,a为true时输出b,a为false时输出c(b为false时除外)
if () then判断一个参数,如果为true,则执行程序块
- 可以使用else,如果if的参数为false,则执行else-end中的语句
- 还可以用elseif () then 来添加额外的条件
注:Lua不支持case句式
myValue=7 if (myValue < 6) then print("1") elseif (myValue < 11) then print("2") else print("3") end
while和repeat
两种控制结构相似,循环执行一段脚本,直到满足某个条件。
while:在执行之前,判断一个参数,条件为true,则循环
- 使用while () do关键字
index = 1 while (index < 10) do print(index) index = index +1 end
- 使用while () do关键字
repeat:在执行最后判断参数,条件为false,则循环(一定会执行一次)
Lua提供了2种for控制结构(数字型和通用型)
- 通用型用于table中
- for关键字后,提供变量值的范围,do关键字开始,end关键字结束
- 第一个,第二个参数 → 表示范围(注:第一个参数需要用一个变量赋值)
- 第三个参数 → 表示”step”(不使用第三个参数则默认为1)
- 注:循环次数只在第一次之行时确定,循环结构中的变量是局部变量。 ```lua for index = 1, 10 do —使用默认步长=1 print(index) end
for index = 1, 10, 2 do —使用步长=2 print(index) end
<a name="l9pVL"></a>
### break
- break语句可以**从循环**控制语句中强制**退出**。用户**不能再循环内使用**。
<a name="xGFCc"></a>
### goto
- 使用goto可以**跳转到**程序相应的**标签处**执行
- 标签形式为:::FLAG::
<a name="zCI2u"></a>
# 注释
- **单行注释**:--
- **多行注释**:
- 注释1:--[[
]]
- 注释2:--[[
--]]
```lua
--单行注释
--[[
多行注释1
]]
--[[
多行注释2
--]]