Lua 小白入门教程Lua 小白入门教程
首页
基础教程
实战进阶
编程指南
首页
基础教程
实战进阶
编程指南
  • 基础教程

    • 📚 基础教程
    • 第1章 - Lua 是什么?
    • 第2章 - 环境搭建
    • 第3章 - 变量与数据类型
    • 第4章 - 运算符与表达式
    • 第5章 - 流程控制
    • 第6章 - 函数
    • 第7章 - Table(表)
    • 第8章 - 字符串与模式匹配

第3章 - 变量与数据类型

嗨,朋友!我是长安。

这一章我们来聊聊 Lua 的变量和数据类型。作为 Java 程序员,你习惯了 int、String、boolean 这些类型声明,但在 Lua 的世界里,一切都不一样了!

🤔 Lua 的 8 种数据类型

Lua 只有 8 种基本数据类型:

类型说明Java 对应
nil空值null
boolean布尔值boolean
number数字(整数和浮点数)int / double
string字符串String
table表(万能数据结构)Map + List + Object
function函数Method / Lambda
userdata用户自定义数据native 对象
thread协程Thread(但不同)

Java 程序员注意

Java 有基本类型和引用类型的区分(int vs Integer),Lua 没有这个区分。Lua 中所有值都是"一等公民",没有装箱拆箱的概念。

📖 变量声明

Lua 的变量声明

-- 局部变量(推荐!类似 Java 的局部变量)
local name = "长安"
local age = 25
local isJavaDev = true

-- 全局变量(不加 local 就是全局的,尽量避免!)
globalVar = "我是全局变量"

-- 一次声明多个变量
local x, y, z = 1, 2, 3

Java 的变量声明

// Java 必须声明类型
String name = "长安";
int age = 25;
boolean isJavaDev = true;

// Java 不能一行声明不同类型的变量
// 但同类型可以
int x = 1, y = 2, z = 3;

核心区别

特性JavaLua
类型声明必须不需要
作用域关键字无(由位置决定)local(推荐)
默认作用域局部全局(危险!)
类型检查编译时运行时

重要提醒

Lua 中不加 local 的变量是全局变量!这和 Java 完全不同。Java 在方法里声明的变量自动就是局部的,但 Lua 不是。永远记得加 local!

🔢 number 类型

Lua 5.3+ 区分整数(integer)和浮点数(float),但它们都是 number 类型。

local a = 42          -- 整数
local b = 3.14        -- 浮点数
local c = 0xff        -- 十六进制 = 255
local d = 1e3         -- 科学计数法 = 1000.0

-- 类型查看
print(type(a))        -- number
print(type(b))        -- number

-- 整数和浮点数可以自由运算
print(a + b)          -- 45.14

-- 整数除法
print(10 / 3)         -- 3.3333333333333(和 Java 不同!)
print(10 // 3)        -- 3(整数除法,类似 Java 的 10 / 3)

Java 对比

在 Java 中,10 / 3 = 3(整数除法)。但在 Lua 中,10 / 3 = 3.333...(始终返回浮点数)。如果你要整数除法,用 // 运算符。

📝 string 类型

-- 单引号和双引号都可以(Java 只能用双引号表示字符串)
local s1 = "Hello"
local s2 = 'World'

-- 多行字符串(Java 13+ 才有文本块)
local s3 = [[
这是一个
多行字符串
可以直接换行
]]

-- 字符串拼接用 .. (不是 +)
local greeting = s1 .. " " .. s2
print(greeting)       -- Hello World

-- 字符串长度用 # (Java 用 .length())
print(#greeting)      -- 11

-- 字符串和数字自动转换
print("10" + 5)       -- 15(自动把 "10" 转成数字!)
print(10 .. 20)       -- 1020(自动把数字转成字符串拼接)

Java 程序员注意

Lua 的 "10" + 5 = 15,它会尝试把字符串转为数字做运算!Java 中 "10" + 5 = "105",是字符串拼接。这个区别一定要记住!

✅ boolean 类型

local isTrue = true
local isFalse = false

-- Lua 的真假规则(和 Java 大不同!)
-- 只有 nil 和 false 是"假",其他所有值都是"真"

-- 以下在 Lua 中都是"真":
if 0 then print("0 是真的!") end            -- 会打印!
if "" then print("空字符串是真的!") end      -- 会打印!
if "false" then print("字符串false是真的!") end -- 会打印!

Java 程序员必须注意

在 Java 中,0、空字符串等不能直接用作布尔条件。但在 Lua 中:

  • 0 是真值(Java/C 中 0 通常表示 false)
  • 空字符串 "" 是真值
  • 只有 nil 和 false 才是假值

这是 Lua 最容易踩坑的地方之一!

🚫 nil 类型

-- nil 类似 Java 的 null
local a = nil
print(a)              -- nil
print(type(a))        -- nil

-- 未声明的变量默认是 nil
print(undeclaredVar)  -- nil(不会报错!Java 会编译错误)

-- 给变量赋 nil 就是"删除"它
local x = 10
x = nil               -- x 被"删除"了

对比 Java

Java 中使用未声明的变量会编译报错,但 Lua 中访问未声明的变量只会返回 nil,不会报错。这既方便又危险——拼写错误很难被发现!

🔄 动态类型

Lua 是动态类型语言,变量可以随时改变类型:

local x = 10          -- number
print(type(x))        -- number

x = "hello"           -- 变成了 string
print(type(x))        -- string

x = true              -- 变成了 boolean
print(type(x))        -- boolean

x = nil               -- 变成了 nil
print(type(x))        -- nil
// Java 中这是不可能的:
int x = 10;
x = "hello";  // 编译错误!类型不匹配

🔍 type() 函数

type() 函数返回值的类型名称(字符串):

print(type(42))           -- number
print(type(3.14))         -- number
print(type("hello"))      -- string
print(type(true))         -- boolean
print(type(nil))          -- nil
print(type(print))        -- function
print(type({}))           -- table
print(type(type))         -- function

💡 长安的学习建议

作为过来人,我想给你几点建议:

  1. 始终使用 local — 养成好习惯,每个变量前面都加 local
  2. 记住真假规则 — 0 和 "" 在 Lua 里是真值!
  3. 小心自动类型转换 — "10" + 5 = 15 这种行为可能让你意外

📝 小结

  • Lua 有 8 种数据类型:nil、boolean、number、string、table、function、userdata、thread
  • 用 local 声明局部变量,不要用全局变量
  • nil 和 false 是假值,其他所有值(包括 0 和空字符串)都是真值
  • Lua 是动态类型,变量可以随时改变类型
  • 字符串拼接用 ..,长度用 #

➡️ 下一步

了解了变量和类型,下一章我们来学习 运算符与表达式,看看 Lua 的运算符和 Java 有哪些不同。

💪 练习题

  1. Lua 中哪些值是"假值"?0 是假值吗?
  2. local a, b, c = 1, 2 执行后 c 的值是什么?
  3. "5" + 3 的结果是什么?"5" .. 3 的结果呢?
  4. 如何获取字符串 "Hello" 的长度?

答案提示

  1. 只有 nil 和 false 是假值,0 不是假值(是真值)
  2. c 的值是 nil(变量多于值,多出的变量赋 nil)
  3. "5" + 3 = 8(字符串自动转数字做运算),"5" .. 3 = "53"(拼接)
  4. #"Hello" 结果为 5
最近更新: 2026/2/27 17:54
Contributors: 王长安
Prev
第2章 - 环境搭建
Next
第4章 - 运算符与表达式