Lua学习笔记:语法

本文更新于2026-02-20,使用Lua 5.5.0。

可以使用lua进入交互模式,或lua FILENAME.lua以非交互模式运行。

行尾的分号可有可无,惯例是无。

关键字

共有22个关键字:

  • and
  • break
  • do
  • else
  • elseif
  • end
  • false
  • for
  • function
  • goto
  • if
  • in
  • local
  • nil
  • not
  • or
  • repeat
  • then
  • until
  • true
  • while
  • return

标识符

以非数字开头的字母、数字、下划线组成的字符串,区分大小写。

数据类型

所有类型的值都是一等公民。

  • 一等公民:可作为参数传递,可从子程序返回,可赋值给变量。
  • 二等公民:可作为参数传递。
  • 三等公民:均不可。

nil

空类型。值为nil。

boolean

布尔类型。值为true或false。

number

数值类型。内部以浮点数表示。

string

字符串类型。值为不可变的字节序列,以""或''引起。

连接字符串:

str = "A" .. "B"

字符串长度(字节数):

local length = #"hello"

table

表类型。

作为数组时,下标从1开始,最后一个元素下标为-1。

local arr = {"a", "b", [3] = "c"}
arr[1] = "aa"
for i, v in ipairs(arr) do
	print(i, v)
end

作为哈希表时,任何值都可作为键:

local map = {a = 1, b = 2}
map.a = 11
map["b"] = 22
map[{}] = 33
for k, v in pairs(map) do
	print(k, v)
end

表大小(表必需是一个真序列,或有__len元方法):

local length = #{1, 2, 3}

userdata

用户数据类型。允许将C程序中的数据保存在Lua变量中,分为两类:完全用户数据,指由Lua管理的内存对应的对象;轻量用户数据,指简单的C指针。

在Lua中,用户数据只有赋值与相等性操作。通过使用元表,用户可以给完全用户数据定义一系列操作,并且只能通过C API创建或修改用户数据。这保证数据仅被宿主程序所控制。

function

函数类型。值为可执行的表达式。

实参个数可与形参个数不等。

函数都是闭包。尾递归特性,函数可以循环跳转也不会消耗栈空间。

多值返回:

function increase(a, b)
	return a+1, b+1
end

local a, b = increase(1, 2)
print(a, b)

可变参数:

function show(a, b, ...)
	for i, v in ipairs{...} do
		print(i, ":", v)
	end
end

show("a", "b", "c", "d")

thread

线程类型。值为独立的执行序列,用于实现协程。

local myProducer

function producer()
	local i = 0
	while true do
		i = i + 1
		coroutine.yield(i)
	end
end

function consumer()
	while true do
		local status, i = coroutine.resume(myProducer)
		print(i)
	end
end

myProducer = coroutine.create(producer)
consumer()

运算符

优先级从高到低依次为:

描述 运算符
乘幂 ^
一元 not, #, -, ~
乘除 *,/,%
加减 +,-
连接字符串 ..
移位 <<,>>
按位与 &
按位异或 ~
按位或 |
比较 <, >, <=, >=, ~=, ==
逻辑与 and
逻辑或 or

数学运算符

运算符 描述
+ 加法。字符串和数值相加,先将字符串转换成数值
- 减法
- 负号
* 乘法
/ 除法。保留13位小数
% 取余
^ 乘幂

位运算符

运算符 描述
& 按位与
| 按位或
~ 按位异或
~ 按位取反(结果为相反数减一)
<< 按位左移。移动位数为负表示反方向移位。如溢出则为0
>> 按位右移。移动位数为负表示反方向移位。如溢出则为0

比较运算符

运算符 描述
== 等于
~= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于

逻辑运算符

nil和false都会判断为假,其他值都判断为真。

运算符 描述
and 与。当第一个参数为假时返回第一个参数,否则返回第二个参数
or 或。当第一个参数为真时返回第一个参数,否则返回第二个参数
not

其它运算符

运算符 描述
.. 连接字符串
# 取长度

表达式语句

赋值语句

local a, b = 1, 2

如左侧变量个数大于右侧值个数,余下变量赋值为nil;如左侧变量个数小于右侧值个数,舍弃多余的值。

if语句

if (true) then
elseif (true) then
else
end

for语句

数值for循环(闭区间):

for i = 1, 100 do
end

for i = 1, 100, 2 do
end

泛型for循环:

for i, v in ipairs{"a", "b"} do
end

while语句

while(true) do
end

repeat语句

repeat
until(true)

注释

单行注释

-- Comment

多行注释

--[[ Comment
Comment
Comment ]]

两组方括号之间可加入一个等号,但前后等号的数量要匹配:

--[=[
Comment
]]
Comment as well
]=]

模式匹配

没有正则表达式,使用模式匹配语法,以%进行转义。

字符分类如下:

  • .:任意字符。
  • %a:字母。
  • %c:控制字符。
  • %d:数字。
  • %l:小写字母。
  • %p:标点符号。
  • %s:空白字符。
  • %u:大写字母。
  • %w:字母和数字连字符。
  • %x:十六进制数字。
  • %z:内部表示为0的字符。

特殊字符有:

  • ^:匹配字符串的开头。
  • $:匹配字符串的结尾。
  • ?:前一项匹配0次或1次。
  • *:前一项匹配0次或多次,尽量匹配最长的字符串。
  • -:前一项匹配0次或多次,尽量匹配最短的字符串。
  • +:前一项匹配1次或多次。
  • []:匹配括号内的任意一个字符。
  • ():将括号内的被匹配内容作为一个分组。
posted @ 2026-06-03 21:20  garvenc  阅读(4)  评论(0)    收藏  举报