Lua数据类型
概述
Lua是一种动态类型语言,变量不需要声明类型,类型信息与值相关联。Lua有8种基本数据类型。
1. nil(空值)
nil表示一个无效值,在条件表达式中相当于false。
lua
local var = nil
print(var) -- 输出: nil
print(type(var)) -- 输出: nil
-- nil用于删除变量
local x = 10
x = nil -- 删除变量x特点
- 全局变量默认值为nil
- 给全局变量赋nil等同于删除它
- nil是false类型,但false不是nil
2. boolean(布尔值)
包含两个值:true和false。
lua
local is_true = true
local is_false = false
print(type(is_true)) -- 输出: boolean
print(type(is_false)) -- 输出: boolean
-- 在条件判断中,只有nil和false为假,其他都为真
if 0 then
print("0是真值") -- 会执行
end
if "" then
print("空字符串是真值") -- 会执行
end逻辑运算
lua
local a = true
local b = false
print(a and b) -- false
print(a or b) -- true
print(not a) -- false
print(not b) -- true3. number(数字)
表示双精度类型的实浮点数。Lua 5.3开始支持整数类型。
lua
-- 整数
local int_num = 42
local hex_num = 0xFF -- 十六进制
local oct_num = 0o77 -- 八进制(Lua 5.2+)
-- 浮点数
local float_num = 3.14
local exp_num = 1.23e-4 -- 科学计数法
print(type(int_num)) -- number
print(type(float_num)) -- number
-- 数学运算
print(10 + 3) -- 13
print(10 - 3) -- 7
print(10 * 3) -- 30
print(10 / 3) -- 3.3333333333333
print(10 // 3) -- 3 (整数除法,Lua 5.3+)
print(10 % 3) -- 1 (取模)
print(10 ^ 3) -- 1000 (幂运算)数字类型判断
lua
-- Lua 5.3+
local x = 42
local y = 3.14
print(math.type(x)) -- integer
print(math.type(y)) -- float4. string(字符串)
字符串由一对双引号或单引号来表示,也可以用双方括号表示长字符串。
lua
-- 基本字符串
local str1 = "Hello"
local str2 = 'World'
local str3 = [[
多行字符串
可以包含换行
]]
print(str1) -- Hello
print(str2) -- World
print(str3) -- 多行字符串...
-- 字符串长度
print(#str1) -- 5
print(string.len(str1)) -- 5转义字符
lua
local escaped = "Hello\nWorld\t!"
print(escaped)
-- 输出:
-- Hello
-- World !
-- 常用转义字符
-- \n 换行
-- \t 制表符
-- \\ 反斜杠
-- \" 双引号
-- \' 单引号
-- \r 回车
-- \a 响铃
-- \b 退格字符串操作
lua
local str = "Lua Programming"
-- 字符串连接
local result = "Hello " .. "World"
print(result) -- Hello World
-- 字符串方法
print(string.upper(str)) -- LUA PROGRAMMING
print(string.lower(str)) -- lua programming
print(string.len(str)) -- 15
print(string.reverse(str)) -- gnimmargorP auL
-- 字符串查找
local pos = string.find(str, "Pro")
print(pos) -- 5
-- 字符串替换
local new_str = string.gsub(str, "Lua", "Python")
print(new_str) -- Python Programming
-- 字符串截取
local sub_str = string.sub(str, 1, 3)
print(sub_str) -- Lua
-- 字符串格式化
local formatted = string.format("Hello %s, you are %d years old", "Alice", 25)
print(formatted) -- Hello Alice, you are 25 years old5. function(函数)
由C或Lua编写的函数。
lua
-- 函数定义
function greet(name)
return "Hello, " .. name
end
-- 匿名函数
local add = function(a, b)
return a + b
end
-- 函数作为参数
local function apply_operation(a, b, operation)
return operation(a, b)
end
print(greet("Lua")) -- Hello, Lua
print(add(5, 3)) -- 8
print(apply_operation(10, 5, add)) -- 15
-- 多返回值
local function get_name_age()
return "Alice", 25
end
local name, age = get_name_age()
print(name, age) -- Alice 25函数特性
lua
-- 函数是第一类值
local func_var = print
func_var("Hello") -- Hello
-- 闭包
local function create_counter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = create_counter()
print(counter()) -- 1
print(counter()) -- 26. userdata(用户数据)
表示任意存储在变量中的C数据结构。
lua
-- userdata通常由C扩展创建
-- 例如文件句柄
local file = io.open("test.txt", "w")
print(type(file)) -- userdata
if file then
file:write("Hello, World!")
file:close()
end7. thread(线程)
表示执行的独立线路,用于执行协程。
lua
-- 创建协程
local co = coroutine.create(function()
print("协程开始")
coroutine.yield()
print("协程结束")
end)
print(type(co)) -- thread
-- 协程状态
print(coroutine.status(co)) -- suspended
-- 执行协程
coroutine.resume(co) -- 协程开始
coroutine.resume(co) -- 协程结束8. table(表)
Lua中的表是一个"关联数组",数组的索引可以是数字、字符串或表类型。
lua
-- 创建空表
local empty_table = {}
-- 数组形式
local array = {1, 2, 3, 4, 5}
print(array[1]) -- 1 (注意:Lua数组索引从1开始)
-- 字典形式
local dict = {
name = "Lua",
version = 5.4,
year = 2020
}
print(dict.name) -- Lua
print(dict["name"]) -- Lua
-- 混合形式
local mixed = {
"first", -- [1] = "first"
"second", -- [2] = "second"
name = "mixed", -- ["name"] = "mixed"
[10] = "tenth" -- [10] = "tenth"
}
print(mixed[1]) -- first
print(mixed.name) -- mixed
print(mixed[10]) -- tenth表操作
lua
local t = {}
-- 添加元素
t.name = "Lua"
t["age"] = 29
t[1] = "first"
-- 删除元素
t.name = nil
-- 表长度(只对数组部分有效)
local arr = {1, 2, 3, 4, 5}
print(#arr) -- 5
-- 遍历表
local person = {name = "Alice", age = 30, city = "Beijing"}
-- pairs遍历所有键值对
for key, value in pairs(person) do
print(key, value)
end
-- ipairs遍历数组部分
local numbers = {10, 20, 30, 40}
for index, value in ipairs(numbers) do
print(index, value)
end类型检查和转换
type()函数
lua
print(type(nil)) -- nil
print(type(true)) -- boolean
print(type(42)) -- number
print(type("hello")) -- string
print(type(print)) -- function
print(type({})) -- table类型转换
lua
-- 数字转字符串
local num = 42
local str = tostring(num)
print(type(str)) -- string
-- 字符串转数字
local str_num = "123"
local num = tonumber(str_num)
print(type(num)) -- number
-- 转换失败返回nil
local invalid = tonumber("abc")
print(invalid) -- nil变量作用域
全局变量
lua
-- 全局变量(不推荐)
global_var = "I'm global"
function test()
print(global_var) -- 可以访问
end局部变量
lua
-- 局部变量(推荐)
local local_var = "I'm local"
function test()
local inner_var = "I'm inner"
print(local_var) -- 可以访问外部局部变量
end
-- print(inner_var) -- 错误:无法访问块作用域
lua
do
local block_var = "I'm in a block"
print(block_var) -- 可以访问
end
-- print(block_var) -- 错误:超出作用域最佳实践
优先使用局部变量
lua-- 好的做法 local name = "Alice" -- 避免的做法 name = "Alice"明确的类型检查
lualocal function safe_add(a, b) if type(a) ~= "number" or type(b) ~= "number" then error("参数必须是数字") end return a + b end合理使用表
lua-- 配置表 local config = { debug = true, max_users = 1000, database = { host = "localhost", port = 3306 } }字符串操作优化
lua-- 大量字符串连接时使用table.concat local parts = {} for i = 1, 1000 do parts[i] = "string" .. i end local result = table.concat(parts, ", ")
总结
Lua的数据类型系统简洁而强大:
- 8种基本类型涵盖了大部分编程需求
- 动态类型提供了灵活性
- 表类型是最重要和最强大的数据结构
- 函数是第一类值,支持函数式编程
- 协程提供了轻量级的并发支持
理解这些数据类型是掌握Lua编程的基础。