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 技术干货!如果觉得有用,记得收藏本文!

相关推荐
张拭心7 小时前
“不卷 AI、不碰币、下班不收消息”——Android 知名技术大牛 Jake Wharton 的求职价值观
android·前端·aigc
SoaringHeart7 小时前
Flutter疑难解决:单独让某个页面的电池栏标签颜色改变
前端·flutter
Yeats_Liao7 小时前
Go Web 编程快速入门 13 - 部署与运维:Docker容器化、Kubernetes编排与CI/CD
运维·前端·后端·golang
Yeats_Liao7 小时前
Go Web 编程快速入门 14 - 性能优化与最佳实践:Go应用性能分析、内存管理、并发编程最佳实践
前端·后端·性能优化·golang
蒜香拿铁8 小时前
Angular【http服务端交互】
前端·http·angular.js
游戏开发爱好者88 小时前
Fiddler抓包实战教程 从安装配置到代理设置,详解Fiddler使用方法与调试技巧(HTTPHTTPS全面指南)
前端·测试工具·小程序·https·fiddler·uni-app·webview
universe_018 小时前
前端八股之HTTP
前端·网络协议·http
初见无风9 小时前
2.7 Lua代码中的可变参数
开发语言·lua·lua5.4
技术砖家--Felix9 小时前
Spring Boot Web开发篇:构建RESTful API
前端·spring boot·restful