返回首页 - Notes - 2011

Lua 基础语法


语言基础

Lua 不强制使用分号,但如果在同一行书写多条 Lua 语句时可以使用分号来分隔

Lua 的变量默认为全局变量,如果没有初始化则默认值为 nil,要删除一个全局变量,只需将其赋值为 nil 即可

Lua 支持的转义字符和 C 语言基本一致

Lua 支持多重赋值,即在一个表达式中对多个变量进行赋值,如 a, b = 10, 20

由于在多重赋值中,Lua 是先对等号右边的所有元素求值然后才执行赋值操作的,所以可以利用这一特性写出简洁的变量交换:x, y = y, xa[i], a[j] = a[j], a[i]

Lua 使用 local 来声明局部变量

Lua 的一种惯用法:local foo = foo,用全局变量 foo 的值初始化局部变量 foo,以临时保存该全局变量当前的值


数据类型

Lua 共有 8 种数据类型

  1. nil:空,主要功能是用于区别其他任何值
  2. boolean:布尔,可选值有 truefalse
  3. number:数字,可以写成任意整数、小数、科学计数法的形式
  4. string:字符串
  5. userdata:自定义类型
  6. function:函数
  7. thread:线程
  8. table:表,这是 Lua 唯一的数据结构

可使用 type 函数来检测变量的数据类型,如:print(type("Ruchee"))

变量所属类型根据所赋值动态变化,值为字符串则为字符串类型,值为数字则为数字类型,此外还允许将函数名赋值给变量

Lua 只把 nilfalse 视为假,其他任何情况包括数字零和空字符串都被视为真


操作符

支持所有常规的算数运算符,此外还拥有一个特殊的指数操作符 ^,如:2^3 = 8

对于取模运算符 %x%1 的结果将是 x 的小数部分,这与 C 语言极为不同,所以有如下结论

  1. x - x%1:代表 x 的整数部分
  2. x - x%0.01:代表 x 精确到小数点后两位的结果

对于关系运算符,== 用于相等性测试,而 ~= 则用于不等性测试,其中 nil 只与其自身相等

只能对两个数字或两个字符串做大小性比较,对于其他数据类型只能做相等性或不等性比较

Lua 的逻辑操作符是 andornot

Luaandor 拥有一种特殊的短路逻辑

  1. and:如果第一个操作数为假,则返回第一个操作数,否则返回第二个操作数
  2. or:如果第一个操作数为真,则返回第一个操作数,否则返回第二个操作数

两种基于短路逻辑的 Lua 惯用法

  1. x = x or y:相等于 if not x then x = y end,即如果 x 存在则值不变,如果不存在则赋值为 y
  2. a and b or c:相等于 C 语言的 a ? b : c,但前提是 b 不能为假,所以比较两数的大小可以简写为 max = (x > y) and x or y

Lua 中,操作符的优先级如下

  1. ^:优先级最高
  2. not#-(负号):优先级很高,仅次于 ^ 操作符
  3. and:优先级很低,仅高于 or 操作符
  4. or:优先级最低

除了指数操作符 ^ 和连接操作符 .. 是“右结合”以外,其他操作符都是“左结合”,所以 x^y^z 等价于 x^(y^z)

注意Lua 不支持 +=-= 这样的复合操作符


注释

行注释:以两个连字符 -- 开始,效果持续到该行的结尾

块注释:以 --[[ 开始,以 ]] 结束

常用的技巧是,使用 --[[--]] 来包含注释块,如

--[[
print("Ruchee")
--]]

如果想要重新启用注释块中的代码,只需在 --[[ 的前面再添加一个连字符使之变成 ---[[ 即可,这样开始与结尾的两个注释标签都变成了普通的行注释


控制结构

Lua 支持 break,但不支持 continue,也不支持 switch语句

典型的 if-else 结构

if op == "+" then
    c = a + b
elseif op == "-" then
    c = a - b
else
    c = a * b
end

典型的 while 结构

while i < 10 do
    print("i = " .. i)
    i = i + 1
end

典型的 repeat-until 结构(repeat 循环至少会执行一次,相当于 do-while

repeat
    print("i = " .. i)
    i = i + 1
until i >= 10

典型的 for 循环结构(数字型 for,第一个参数为起始值,第二个参数为终止值,第三个参数为步进值,可选)

for i = 10, 1, -1 do
    print("i = " .. i)
end

典型的 for 循环结构(泛型 for,使用迭代器函数来遍历)

for i, v in ipairs(tab) do
    print("tab[" .. i .. "] = " .. v)
end

Lua 标准库提供了几种常用的迭代器

  1. io.lines:迭代文件中的每行
  2. pairs:迭代 table 元素
  3. ipairs:迭代数组元素
  4. string.gmatch:迭代字符串中的单词

date : 2011-10-01