Lua世界的基石:变量、作用域与七大数据类型

一、变量与作用域:local 的重要性

在 Lua 中,变量不需要声明就可以直接赋值使用。但这样做会创建一个全局变量(Global Variable),这通常不是我们想要的结果。

全局变量的陷阱:

  • 命名冲突:在大型项目中,不同模块可能会无意中覆盖同名的全局变量,导致难以追踪的 Bug。
  • 性能问题:Lua 访问局部变量比访问全局变量更快。
  • 内存泄漏 :全局变量除非被显式设为 nil,否则不会被垃圾回收器回收。

local 创建的变量是局部变量(Local Variable) ,其作用域(Scope)仅限于它所在的代码块内。

lua 复制代码
-- 这是全局变量,应避免
g_name = "Global Alice"

local function my_function()
    -- 这是局部变量,作用域仅在此函数内
    local l_name = "Local Bob"
    print(g_name) -- 可以访问外部的全局变量

    if true then
        -- 这是一个新的代码块,'l_name' 依然可见
        local block_var = "I'm in a block"
        print(l_name)
    end
  
    -- print(block_var) -- 错误!'block_var' 在这里已经超出了作用域
end

my_function()
-- print(l_name) -- 错误!'l_name' 在函数外部不可见

多重赋值(Multiple Assignment) Lua 还支持一种非常方便的语法,可以同时给多个变量赋值:

lua 复制代码
local x, y = 10, 20
print(x, y) -- 输出: 10   20

-- 常用于交换变量值
x, y = y, x
print(x, y) -- 输出: 20   10

二、Lua 的七大数据类型

Lua 的所有值(Value)都带有类型。它内置了 8 种基础类型,你可以使用 type() 函数来查看任何一个值的类型。

1. nil(空)

nil 是一个非常特殊的类型,它只有一个值,就是 nil

  • 一个未赋值的全局变量,其默认值就是 nil
  • 将一个全局变量赋值为 nil 是删除它的唯一方法,这会触发垃圾回收。
lua 复制代码
local a
print(type(a)) -- 输出: nil

local t = { key = "value" }
t.key = nil -- 从 table 中移除了这个键值对

2. boolean(布尔)

布尔类型只有两个值:truefalse

重要 :在 Lua 的条件判断中,只有 falsenil被视为"假",其他所有值(包括数字 0 和空字符串 "")都视为"真"

lua 复制代码
if 0 then print("0 is true") end -- 会被打印
if "" then print("Empty string is true") end -- 会被打印

3. number(数字)

在 Lua 5.2 及之前的版本中,number 类型统一表示为双精度浮点数。从 Lua 5.3 开始,引入了对整数(integer)和浮点数(float)的区分,但这在后台自动处理,对开发者来说通常是透明的。

lua 复制代码
local num1 = 10     -- 整数
local num2 = 3.14   -- 浮点数
local num3 = 1e3    -- 科学记数法, 等于 1000
print(type(num1)) -- 输出: number

4. string(字符串)

Lua 的字符串是不可变的 (Immutable)字节序列。你可以用单引号 ' 或双引号 " 来创建。

  • 它们之间没有区别。
  • 字符串一旦创建,就不能修改其中的某个字符,任何操作(如拼接 ..)都会返回一个新的字符串。
lua 复制代码
local greeting = "Hello"
local name = 'Lua'
local message = greeting .. ", " .. name .. "!" -- 拼接
print(message) -- 输出: Hello, Lua!

-- 长字符串/多行字符串
local html = [[
<html>
    <head><title>Lua</title></head>
    <body>Hello World!</body>
</html>
]]

5. table(表)

这是 Lua 最核心、最强大 的数据类型。table 是一种关联数组,它可以用来实现普通数组、字典(哈希映射)、集合、记录、命名空间,甚至是面向对象中的"对象"。

lua 复制代码
-- 作为数组 (索引从 1 开始)
local arr = { "apple", "banana", "orange" }
print(arr[1]) -- 输出: apple

-- 作为字典 (key-value pairs)
local person = {
    name = "David",
    age = 30,
    ["is_student"] = false -- key 也可以是字符串
}
print(person.name)     -- 点号语法糖
print(person["age"])   -- 方括号语法

-- 混合使用
local mixed = { 10, 20, x = "hello", y = "world" }
print(mixed[1], mixed.x) -- 输出: 10   hello

6. function(函数)

在 Lua 中,函数是"一等公民",这意味着函数本身也是一种数据类型。你可以像操作其他值一样操作它们:存入变量、放入表中、作为参数传递或作为返回值。

lua 复制代码
local function say(msg)
    print(msg)
end

local greet = say -- 将函数赋值给变量
greet("Hi there!") -- 调用它

7. userdata(用户数据)

userdata 类型允许 C 代码将自定义的、任意的 C 数据存储在 Lua 变量中。这通常用于将 Lua 与 C/C++ 库进行绑定,在纯 Lua 代码中我们很少直接创建它。

结语

点个赞,关注我获取更多实用 Lua 技术干货!如果觉得有用,记得收藏本文!

相关推荐
XiaoYu200214 分钟前
第3章 Nest.js拦截器
前端·ai编程·nestjs
千寻girling20 分钟前
面试官 : “ 说一下 Map 和 WeakMap 的区别 ? ”
前端·javascript·面试
2501_9240641125 分钟前
2025年主流Web自动化测试工具功能与适用场景对比
前端·测试工具·自动化
IT_陈寒38 分钟前
Vite 5 实战:7个鲜为人知的配置技巧让构建速度提升200%
前端·人工智能·后端
gg1593572846039 分钟前
JavaScript 核心基础
前端·javascript·vue.js
Stanford_11061 小时前
【2026新年启程】学习之路,探索之路,技术之路,成长之路……都与你同行!!!
前端·c++·学习·微信小程序·排序算法·微信开放平台
打小就很皮...1 小时前
网页包装为桌面应用(Nativefier版)
前端·桌面应用·nativefier
自由生长20241 小时前
为什么我们需要流式系统?
前端
北辰alk1 小时前
从零设计一个Vue路由系统:揭秘SPA导航的核心原理
前端·vue.js
鱼鱼块2 小时前
彻底搞懂 React useRef:从自动聚焦到非受控表单的完整指南
前端·react.js·面试