第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;
核心区别
| 特性 | Java | Lua |
|---|---|---|
| 类型声明 | 必须 | 不需要 |
| 作用域关键字 | 无(由位置决定) | 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
💡 长安的学习建议
作为过来人,我想给你几点建议:
- 始终使用
local— 养成好习惯,每个变量前面都加local - 记住真假规则 —
0和""在 Lua 里是真值! - 小心自动类型转换 —
"10" + 5 = 15这种行为可能让你意外
📝 小结
- Lua 有 8 种数据类型:
nil、boolean、number、string、table、function、userdata、thread - 用
local声明局部变量,不要用全局变量 nil和false是假值,其他所有值(包括 0 和空字符串)都是真值- Lua 是动态类型,变量可以随时改变类型
- 字符串拼接用
..,长度用#
➡️ 下一步
了解了变量和类型,下一章我们来学习 运算符与表达式,看看 Lua 的运算符和 Java 有哪些不同。
💪 练习题
- Lua 中哪些值是"假值"?
0是假值吗? local a, b, c = 1, 2执行后c的值是什么?"5" + 3的结果是什么?"5" .. 3的结果呢?- 如何获取字符串
"Hello"的长度?
答案提示
- 只有
nil和false是假值,0不是假值(是真值) c的值是nil(变量多于值,多出的变量赋 nil)"5" + 3 = 8(字符串自动转数字做运算),"5" .. 3 = "53"(拼接)#"Hello"结果为 5
