Lua 中定义变量的语法如下:
local 变量名 = 初始值
其中 local 表示定义局部变量,若删去 local 则表示定义全局变量。
例如:
local x = 10 -- 定义局部变量 x,初始值为 10
定义局部变量 x,初始值是 10
示例代码中的两个短横线(
--)表示单行注释,用于对代码进行解释说明,运行时会被解释器忽略。
Lua 有 8 种基本数据类型,分别是: nil,boolean,number,string,table,function,thread 和 userdata。
| 数据类型 | 说明 |
|---|---|
nil |
只有 nil 值的类型是 nil,nil 值表示数据的无效值 |
boolean |
布尔类型,包含真(true)和假(false)两个值 |
number |
数值类型,例如 2025,3.1415926 |
string |
字符串类型,通过一对双引号("")或单引号('')包裹,例如 "hello" |
table |
表类型,是 Lua 中唯一的数据结构机制,键和值可以是 nil 以外的任何类型 |
function |
函数类型 |
thread |
协程类型 |
userdata |
用户数据类型,主要是通过 C API 创建的数据 |
使用 type 函数可以判断值的类型,返回值是一个字符串:
print(type(nil) == 'nil')
print(type(false) == 'boolean')
print(type(1) == 'number')
print(type('hello') == 'string')
运行结果:
true
true
true
true
nil 类型仅有 nil 一个值,是用于表示无效的空值。
如果读取一个没有被初始赋值的变量,就会得到 nil:
print(a) -- 得到值 nil
print(type(a)) -- type(a) 返回字符串的 "nil"
运行结果:
nil
nil
boolean 类型用于表示逻辑值:真(true)或假(false)。
逻辑运算的真值表:
X |
Y |
与运算 X and Y |
或运算 X or Y |
非运算 not X |
|---|---|---|---|---|
true |
true |
true |
true |
false |
true |
false |
false |
true |
false |
false |
true |
false |
true |
true |
false |
false |
false |
false |
true |
与运算符 and:X 和 Y 都是 true 时结果为 true;任意一个为 false 时结果为 false
或运算符 or:X 或 Y 任意一个是 true 时结果为 true;都是 false 时结果为 false
非运算符 not:not true 结果为 false;not false 结果为 true
boolean 类型以外的值在逻辑运算中,nil 被视作假,其它值均被视为真。
示例:
print(true and true)
print(true and false)
print(true or false)
print(not true)
运行结果:
true
false
true
false
number 类型表示数值;在 Lua 中不区分整数和小数类型,默认使用双精度浮点数表示。
Lua 支持以下数学运算符:
+: 加法
-: 减法
*: 乘法
/: 浮点除法
//: 向下取整除法
%: 取模(除法取余数)
^: 乘方
-: 负号
示例:
print(1+1)
print(3*7)
print(9/2)
print(9//2) -- 9 除以 2,向下取整
print(9%2) -- 9 除以 2 的余数
print(2^10) -- 2 的 10 次方
运行结果:
2
21
4.5
4
1
1024.0
Lua 支持以下位运算:
&: 按位与
|: 按位或
~: 按位异或
>>: 右移
<<: 左移
~: 按位非
所有的位操作都将操作数先转换为整数,然后按照二进制位进行操作,其结果是一个整数。
对于右移和左移,均用零来填补空位。移动的位数若为负,则向反方向位移;若移动的位数的绝对值大于等于整数本身的位数,其结果为零 (所有位都被移出)。
示例:
print(0xf8 & 0x1f) -- 按位与
print(0xf8 | 0x1f) -- 按位或
print(0xf8 ~ 0x1f) -- 按位异或
print(1 << 10) -- 左移 10 位
print(~0xf0) -- 按位非
运行结果:
24
255
231
1024
-241
string 类型表示文本内容,值使用成对的双引号("")或单引号('')包裹。
示例:
local name = "Tom"
local sex = "male"
对于一些无法直接表示的字符(例如换行)可以使用转义字符表示,以下是转义字符表:
| 转义字符 | 说明 |
|---|---|
\\ |
表示反斜杠(\)本身 |
\' |
表示单引号(') |
\" |
表示双引号(") |
\a |
(用于让蜂鸣器发出响声,通常不可用) |
\b |
退格(Backspace) |
\n |
换行符 |
\v |
纵向制表符 |
\t |
横向制表符(Tab) |
\r |
回车(Return) |
\f |
换页符号 |
Lua 支持多行字符,以两对方括号([[]])包裹。
例如:
-- 多行字符串
local sql_query = [[
SELECT name, age, email
FROM users
WHERE age > 18
AND status = 'active'
ORDER BY name
]]
print(sql_query)
运行结果:
SELECT name, age, email
FROM users
WHERE age > 18
AND status = 'active'
ORDER BY name
多行字符串中会保留所有空格、缩进以及换行
Lua 可以使用 .. 运算符进行字符串拼接操作:
print("hello" .. "world")
运行结果:
helloworld