一、变量与作用域: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(布尔)
布尔类型只有两个值:true 和 false。
重要 :在 Lua 的条件判断中,只有 false 和 nil被视为"假",其他所有值(包括数字 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)) -- 输出: number4. 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   hello6. 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 技术干货!如果觉得有用,记得收藏本文!