4.简单变量类型

4.简单变量类型


4.1 知识点

Lua所有的变量类型

Lua 中一共有 8 种基础类型:

  • nil
  • boolean
  • number
  • string
  • function
  • table
  • userdata
  • thread

本篇先只讲最常见、最基础的几种:

  • nil 空型
  • number 数值型
  • string 字符串型
  • boolean 布尔型

functiontablethread 后面会在函数、表、协同程序对应章节里继续讲。

userdata 一般和宿主环境有关,比如 C/C++ 扩展,或者 Unity Lua 方案里暴露给 Lua 的对象。纯 Lua 语法阶段只需要先知道有这个类型,不在这里展开。像 userdata / lightuserdata / C# 对象生命周期 / ObjectTranslator 这些内容,更适合放到后面的 xLua / toLua 源码浅析系列里讲。

简单变量类型的声明与赋值

  • 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 只有两个值:truefalse
  • Lua 里只有 falsenil 会被当成假。
  • 其他值都是真,包括 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++ 扩展提供,纯 Lua 语法阶段只需要知道它存在即可。
print(type(function() end)) -- function

print(type({}))             -- table

local co = coroutine.create(function()
end)
print(type(co))             -- thread

基础语法阶段先把 nil / number / string / boolean / type 这些基础变量学习了,后面再一点点往函数、表、协程和宿主交互等进阶的深入学习。

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

print("**********知识点二 简单变量类型的声明与赋值************")
-- Lua 中的简单变量类型有:
-- nil 空型
-- number 数值型
-- string 字符串型
-- boolean 布尔型
-- Lua 中所有的变量声明都不需要声明变量类型,Lua 会自动判断类型,类似 C# 里面的 var
-- Lua 中的一个变量可以重新赋不同类型的值,Lua 会根据当前值识别类型

a = nil
a = 1
a = "123"
a = false

-- Lua 中使用没有声明过的变量
-- 不会报错,默认值是 nil
print(b) -- nil

print("**********知识点三 nil空型变量************")
-- nil 有点类似 C# 中的 null
c = nil
print(c) -- nil

print("**********知识点四 number数值型变量************")
-- number 表示数值类型
-- 基础语法阶段,可以先简单理解为整数和小数都是 number
d = 1
print(d) -- 1

e = 1.2
print(e) -- 1.2

print("**********知识点五 string字符串型变量************")
-- 字符串的赋值使用单引号或者双引号包裹都可以
-- Lua 中没有 char 变量,单个字符也是字符串
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

print("**********知识点七 其他非简单变量类型************")
-- function:函数类型,后面函数篇会详细讲
-- table:表类型,后面表篇会详细讲
-- thread:协同程序类型,后面协同程序篇会详细讲
-- userdata:一般由宿主环境或 C/C++ 扩展提供,纯 Lua 语法阶段只需要先知道有这个类型

print(type(function() end)) -- function
print(type({}))             -- table

local co = coroutine.create(function()
end)
print(type(co))             -- thread

print("**********知识点八 type函数************")
-- 在 type 函数中传入变量,可以得到变量的类型
-- type 函数的返回值是 string
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

×

喜欢就点赞,疼爱就打赏