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

相关推荐
MQliferecord7 分钟前
如何快速实现响应式多屏幕适配
前端
韭菜炒大葱9 分钟前
从回调到async/await:JavaScript异步编程的进化之路
前端·javascript·面试
凌晨起床11 分钟前
前端开发规范
前端
Cache技术分享21 分钟前
247. Java 集合 - 为什么要远离 Stack 类?
前端·后端
v***913031 分钟前
Spring+Quartz实现定时任务的配置方法
android·前端·后端
charlie11451419140 分钟前
面向C++程序员的JavaScript 语法实战学习4
开发语言·前端·javascript·学习·函数
万少40 分钟前
上架元服务-味寻纪 技术分享
前端·harmonyos
想不明白的过度思考者1 小时前
Spring Web MVC从入门到实战
java·前端·spring·mvc
AAA简单玩转程序设计1 小时前
C++进阶小技巧:让代码从"能用"变"优雅"
前端·c++
子洋1 小时前
群晖 DSM 更新后 Cloudflare DDNS 失效的排查记录
前端·后端·dns