On this page

Lua 数据类型

Lua 数据类型详解

Lua 是一种动态类型语言,它有 8 种基本数据类型:

1. nil (空值)

  • 表示"无"或"无效值"
  • 未声明的变量默认值为 nil
  • 将变量赋值为 nil 等同于删除该变量
local x
print(x)  -- 输出: nil

x = 10
x = nil  -- 删除变量x

2. boolean (布尔)

  • 只有两个值:true 和 false
  • Lua 中只有 false 和 nil 被视为假,其他所有值都为真(包括0和空字符串)
local a = true
local b = false

if 0 then
  print("0 is true in Lua")  -- 这行会执行
end

3. number (数字)

  • 表示整数和浮点数(5.3版本后区分整数和浮点数)
  • 不区分整型和浮点型(5.3版本前)
local int = 123
local float = 3.1415
local hex = 0xff    -- 十六进制
local sci = 1.23e4  -- 科学计数法

4. string (字符串)

  • 表示文本数据
  • 不可变(每次修改实际是创建新字符串)
  • 用单引号或双引号包围
  • 支持多行字符串([[...]])
local s1 = "hello"
local s2 = 'world'
local s3 = [[
多行
字符串
]]

-- 字符串连接
local greeting = s1 .. " " .. s2

-- 字符串长度
print(#greeting)  -- 输出: 11

5. function (函数)

  • 第一类值,可以存储在变量中
  • 可以作为参数传递和从函数返回
  • 支持闭包
-- 函数定义
local function add(a, b)
  return a + b
end

-- 匿名函数
local mul = function(a, b) return a * b end

-- 高阶函数
function apply(func, a, b)
  return func(a, b)
end

print(apply(add, 2, 3))  -- 输出: 5

6. table (表)

  • Lua 中唯一的数据结构
  • 可以当作数组、字典、对象等使用
  • 索引可以是除 nil 外的任何值
-- 数组式表(索引从1开始)
local arr = {10, 20, 30}
print(arr[1])  -- 输出: 10

-- 字典式表
local dict = {
  name = "Lua",
  version = 5.4,
  ["release date"] = "2020"  -- 包含特殊字符的键
}

-- 混合表
local mix = {
  "value1",  -- 隐式键1
  "value2",  -- 隐式键2
  key3 = "value3"
}

7. userdata (用户数据)

  • 用于将 C 数据存储在 Lua 变量中
  • 通常用于扩展 Lua 功能
-- 通常由C API创建
local file = io.open("test.txt", "r")
print(type(file))  -- 输出: userdata

8. thread (线程)

  • 表示协程
  • 不同于操作系统的线程,是 Lua 的协作式线程
local co = coroutine.create(function()
  print("coroutine running")
end)

print(type(co))  -- 输出: thread

类型相关函数

-- 获取变量类型
print(type("hello"))  -- 输出: string
print(type(123))     -- 输出: number
print(type(true))    -- 输出: boolean
print(type(print))   -- 输出: function

-- 类型转换
local num = tonumber("123")  -- 字符串转数字
local str = tostring(123)    -- 数字转字符串

Lua 的数据类型系统虽然简单但非常灵活,特别是 table 类型可以模拟许多复杂的数据结构。理解这些数据类型是掌握 Lua 编程的基础。