4.简单变量类型
4.1 知识点
Lua所有的变量类型
Lua 中一共有 8 种基础类型:
- nil
- boolean
- number
- string
- function
- table
- userdata
- thread
先学习最基础的几种:
- nil 空型
- number 数值型
- string 字符串型
- boolean 布尔型
function、table、thread 后面再学习。
userdata 一般和宿主环境有关,比如 C/C++ 扩展,或者 Unity Lua 方案里暴露给 Lua 的对象,不展开。
简单变量类型的声明与赋值
- Lua 中所有的变量声明都不需要声明变量类型,Lua 会自动判断类型,类似 C# 里面的
var。 - Lua 中的变量可以重新赋不同类型的值,Lua 会根据当前赋进去的值识别类型。
- 重新赋值虽然方便,但项目代码里不建议同一个变量各种类型乱换,读代码会不清晰。
a = nil
a = 1
a = "123"
a = false
- Lua 中使用没有声明过的变量,不会报错,默认值是
nil。
print(b) -- nil
nil空型变量
nil有点类似 C# 中的null。- 一个变量没有赋值时,默认就是
nil。 - 表里的字段被赋值为
nil可以理解为相当于不存在。
c = nil
print(c) -- nil
number数值型变量
number表示数值类型。- 基础语法阶段,可以简单理解为整数和小数都是
number。 - 不同 Lua 版本里,数字底层实现会有一些差异,不展开。
d = 1
print(d) -- 1
e = 1.2
print(e) -- 1.2
string字符串型变量
- 字符串的赋值使用单引号或者双引号包裹都可以。
- Lua 中没有
char变量,单个字符也是字符串。 - 项目里一般按团队习惯统一一种写法,最好不要一会儿单引号,一会儿双引号。
f = "12312"
print(f) -- 12312
g = '123'
print(g) -- 123
boolean布尔型变量
- boolean 只有两个值:
true和false。 - Lua 里只有
false和nil会被当成假。 - 其他值都是真,包括
0、空字符串""、空表{}。
h = true
print(h) -- true
i = false
print(i) -- false
if 0 then
print("0 在 Lua 中也是真")
end
if "" then
print("空字符串在 Lua 中也是真")
end
和 C#、C、C++、Python 不太一样。写条件判断时一定不能把 0 也当成假。
其他非简单变量类型
除了上面几个简单类型,Lua 里其他几个类型先简单认识:
function:函数类型。Lua 里的函数可以像普通变量一样保存、传参、返回。table:表类型。Lua 里最核心的复合结构,数组、字典、对象都要用。thread:协同程序类型,不是操作系统线程。userdata:一般由宿主环境或 C/C++ 扩展提供。
print(type(function() end)) -- function
print(type({})) -- table
local co = coroutine.create(function()
end)
print(type(co)) -- thread
type函数得到变量的类型
- 在
type函数中传入变量,可以得到变量的类型。 type函数的返回值是字符串。
print(type(c)) -- nil
print(type(type(c))) -- string
print(type(d)) -- number
print(type(e)) -- number
print(type(f)) -- string
print(type(g)) -- string
print(type(h)) -- boolean
print(type(i)) -- boolean
print(type(type(c))) 输出 string,是因为 type(c) 的返回值本身就是字符串 "nil"。
调试 Lua 脚本时,type 很常用。动态类型语言里,很多报错是变量当前类型和预期不一样。打印一下 type(x) 能更快地定位问题。
4.2 知识点代码
Lesson4_简单变量类型.lua
print("**********简单变量类型************")
print("**********知识点一 Lua所有的变量类型************")
-- Lua 一共 8 种基础类型:nil、boolean、number、string、function、table、userdata、thread
-- 先学 nil、number、string、boolean
-- function、table、thread 后面再学习
-- userdata 和宿主/C#/Unity 对象有关,不展开
print("**********知识点二 简单变量类型的声明与赋值************")
-- 声明不用写类型,类似 C# 的 var;可重新赋不同类型,Lua 按当前值识别
-- 项目里不建议同一变量各种类型乱换
a = nil
a = 1
a = "123"
a = false
-- Lua 中使用没有声明过的变量
-- 不会报错,默认值是 nil
print(b) -- nil
print("**********知识点三 nil空型变量************")
-- nil 类似 C# 的 null;未赋值默认 nil;表字段赋 nil 一般等于移除字段
c = nil
print(c) -- nil
print("**********知识点四 number数值型变量************")
-- number:整数和小数都是 number;版本底层差异不展开
d = 1
print(d) -- 1
e = 1.2
print(e) -- 1.2
print("**********知识点五 string字符串型变量************")
-- 单引号、双引号都可以;没有 char,单字符也是 string
-- 项目里引号写法按团队习惯统一
f = "12312"
print(f) -- 12312
g = '123'
print(g) -- 123
print("**********知识点六 boolean布尔型变量************")
-- boolean 只有 true 和 false 两个值
h = true
print(h) -- true
i = false
print(i) -- false
-- Lua 里只有 false 和 nil 是假;0、空字符串、空表都是真
if 0 then
print("0 在 Lua 中也是真")
end
if "" then
print("空字符串在 Lua 中也是真")
end
-- 写条件判断时不把 0 也当成假,和 C# 等不太一样
print("**********知识点七 其他非简单变量类型************")
-- function:可像普通变量保存、传参、返回
-- table:数组、字典、对象都要用
-- thread:协同程序,不是操作系统线程
-- userdata:宿主或 C/C++ 扩展提供
print(type(function() end)) -- function
print(type({})) -- table
local co = coroutine.create(function()
end)
print(type(co)) -- thread
print("**********知识点八 type函数************")
-- type(x) 返回类型名字符串
-- type(type(c)) 是 string,因为 type(c) 本身返回 "nil"
-- 调试时先 print(type(x)),很多错是类型和预期不一致
print(type(c)) -- nil
print(type(type(c))) -- string
print(type(d)) -- number
print(type(e)) -- number
print(type(f)) -- string
print(type(g)) -- string
print(type(h)) -- boolean
print(type(i)) -- boolean
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com