命名建议

  • 常量用全大写和下划线,例:MY_CONSTANT
  • 变量第一个字母小写,例:myVariable
  • 全局变量第一个字母用小写g表示,例:gMyGlobal
  • 函数名第一个字母大写,例:function MyFunction( )
  • 避免使用_开头,可以将_移至末尾
    • 避免与内置的_Version冲突

局部变量和全局变量

全局变量

  • 全局变量:Lua中的变量默认全局的。变量的保持不变的,除非脚本改动

    • 变量名前加一个g字母,尽量使用局部变量

      局部变量

  • 局部变量:可以给它设定一个初始值,在变量之前必须使用关键字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

  1. - 局部变量的有效范围:
  2. ```lua
  3. function MyFunction()
  4. local myX=7 --myX将会在函数结束时被销毁
  5. if myX < 10 then
  6. local myY = "hello world" --myY将会在代码块if结束后被销毁
  7. print(myY) --输出“hello world”
  8. end
  9. print(myY) --输出nil,因为myY已被销毁
  10. end

数据类型

  • lua中不需指定变量类型

    myValue = 7
    
  • Lua中有5中变量类型:nil、Boolean、string、Number、table

    nil

  • 表示变量还未赋值

  • 给一个变量赋值为nil,则表示删除变量

    Boolean

  • 只有 true 和 false 两种值。

    • number型 和 空字符串都被认为是true
    • nil被认为是false
  • 除了false和nil被认为是false,其余的都认为是true

    string

  • 包括特殊字符串(转义字符),可以小到一个字符,也可以包含百万字符。

  • 创建之后不可改变,只能重新创建

    Number

  • 在Lua5.3版本后,加入了整形,所以在Lua中有整形双精度浮点数

  • 逻辑判断整形浮点型被认为是相等
  • 如果要知道number是整形还是浮点型,则需要用到数学库函数math.type()

    • math.type(3) → integer
    • math.type(3.0) → float

      table

  • Lua中table不仅可以用数值作索引,还可以用字符串其他类型都可以作为索引

    • 注:nil不可作为索引
  • table要么是要么是变量,可以看成对象
    • Lua中table是一种动态分配对象只能操作指向表的引用(或指针),不能进行表的复制
      • 设a为table,则b=a只会给b赋上a的指针,并不是新建一个与a相同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

  • 语义:当x为空时,赋值v给x

    a and b or c

  • 相当于a?b:c,a为true时输出b,a为false时输出c(b为false时除外)

    • 使用时,b和c最好为数值,这样就不会被认为是false

      控制结构

      if

  • 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
      
  • repeat:在执行最后判断参数,条件为false,则循环(一定会执行一次)

    • 使用repeat {} until ()
      index = 1
      repeat
      print(index)
      index = index + 1
      until (index > 10)
      

      for

  • 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
--]]