查看: 4|回复: 0

掌握Lua的基本数据类型:入门必备基础

[复制链接]

34

主题

51

回帖

1100

积分

金牌会员

积分
1100
发表于 昨天 09:56 | 显示全部楼层 |阅读模式
二、Lua基本数据类型
Lua总共有9个基本数据类型,分别是:boolean(布尔) , number(数值) , string (字符串), nil(空) , function , table (表),userdata , lightuserdata , thread(线程)。
(lua.h)
展开代码语言:C


自动换行


AI代码解释






/*** basic types*/#define LUA_TNONE               (-1)#define LUA_TNIL                0#define LUA_TBOOLEAN            1#define LUA_TLIGHTUSERDATA      2#define LUA_TNUMBER             3#define LUA_TSTRING             4#define LUA_TTABLE              5#define LUA_TFUNCTION           6#define LUA_TUSERDATA           7#define LUA_TTHREAD             8#define LUA_NUMTAGS             9


展开代码语言:Bash


自动换行


AI代码解释






> type(nil)nil> type(true)boolean> type(6.66)number> type("hello")string> type(io.stdin)userdata> type(print)function> type(type)function> type({})table


类型
数据结构
LUA_TNONE
无类型
LUA_TNIL
空类型
LUA_TBOOLEAN
布尔类型
LUA_TLIGHTUSERDATA
指针
void *
LUA_TNUMBER
数字
lua_Number
LUA_TSTRING
符串
TString
LUA_TTABLE
Table
LUA_TFUNCTION
函数
CClosure、LClosure
LUA_TUSERDATA
指针
void *
LUA_TIHREAD
Lua虚拟机、协程
lua_State
其中 LUA_TLIGHTUSERDATA和LUA_TUSERDATA一样 ,区别在于前者的分配释放由 Lua外部的使用者来完成,而后者则是通过Lua 内部来完成的。
userdata 类型允许把任意的 语言数据保存在 Lua 语言变量中 Lua 语言中,用户数据类型除了赋值和相等性测试外,没有其他预定义的操作 用户数据被用来表示由应用或语言编写的库所创建的新类型。
2.1、nil
nil 是一种只有一个 ni 值的类型,它的主要作用就是与其他所有值进行区分。Lua使用 nil 来表示无效值的情况 ,一个全局变量在第一次被赋值前的默认值就是nil, 而将 nil 赋值给全局变量则相当于将其删除。
2.2、boolean
Boolean 型具有两个值: true和false ,它们分别代表了传统布尔值。不过,Lua语言中条件测试(例如控制结构中的分支语句)将除 Boolean的false和nil外的所有其他值视为真特别的是,在条件检测中 Lua 语言把零和空字符串也都视为真。
Lua 语言支持常见的逻辑运算符: and、or、not。和条件测试一样,所有的逻辑运算将Boolean 类型的 false nil 当作假,而把其他值当作真。
逻辑运算符 and 的运算结果为:如果它的第一个操作数为“false”,则返回第一个操作数,否则返回第二个操作数。
逻辑运算 or 的运算结果为:如果它的第一个操作数不为“false”,则返回第一个操作数,否 返回第二个操作数。
展开代码语言:Bash


自动换行


AI代码解释






Lua 5.3.6  Copyright (C) 1994-2020 Lua.org, PUC-Rio> 1 and 22> nil and 10nil> false and 4false> 0 or 50> false or "hello"hello> nil or falsefalse


and or 都遵循短路求值( Short-circuit 巳valu ion )原则,即只在必要时才对第二个操作数进行求值。
not 运算符永远返回 Boolean 类型的值。
展开代码语言:Bash


自动换行


AI代码解释






> not niltrue> not falsetrue> not 0false> not not 1true> not not nilfalse


2.3、number
Lua 语言为数值格式提供了两种选择 被称为 int 64 型和被称为float 的双精度浮点型(注意,lua中“float”不代表单精度类型)。整型的 人是 Lu 5.3 要标志,也是与之前版本相 的主要区。
展开代码语言:Bash


自动换行


AI代码解释






> type(3)number> type(3.3)number> type(3.333333333333333333333333333333333333333)number> type(-3)number> type(0.2e3)number> type(0x1p-1)number


具有十进制小数或者指数的数值会被当作浮点型值,否则会被当作整型值,还可以使用科学记数法书写数值常量。
由于整型值和浮点型值 类型都是 number ,所以它 是可以相互转换的。同时 ,具有相算术值的整型值 和点型值在lua语言中是相等的。
代码语言:Bash


自动换行


AI代码解释






> 1==1.0true> -3==-3.0true> 0.2e3==200true


在少数情况 ,当需要区分整型值和浮点型值 ,可以使用函数 math.type:
代码语言:Bash


自动换行


AI代码解释






> math.type(3)integer> math.type(3.0)float


Lua 语言像其 语言一样 支持 0x开头的十六进制常量。
代码语言:Bash


自动换行


AI代码解释






> 0x1a3419> 0xff255


除了加、戚、乘、除、取负数(单目减法,即把减号当作一元运算符使用)等常见的术运算外, lua 语言还支持取整除法( floor 除法)、取模和指数运算。
Lua 语言同样支持幕运算,使用符号^表示。
展开代码语言:Bash


自动换行


AI代码解释






> 1+23> 1-2-1> 1*22> 1/20.5> 3 // 21> 12 %30> 2^124096.0


2.4、string
字符串用于表示文本。Lua 语言中的字符串是一串字节组成的序列, Lua 核心并不关心这些字节究竟以何种方式编码文本 Lua 中,字符使用 个比特位来存储。Lua 中字符串可以存储包括空字符在内的所有数值代码,这意味着可以在字符串中存储任意的
二进制数据。Lua 的字符串标准库默认处理 个比特位( 1 Byte )的字符,但是也同样可以非常优雅地处理 UTF-8 字符串。
Lua 语言中的字符串是不可变值,不能像在c语言中那样直接改变某个字符串中的某个字符,但是可以通过创建一个新字符串 的方式来达到修改的目的,例如:
展开代码语言:Bash


自动换行


AI代码解释






> a="one two"> b=string.gsub(a,"one","none")> print(a)one two> print(b)none two>


Lua 语言中的字符串 是自动内存管理的对象之一 ,这意味着 Lua 语言会负责字符串的分配和释放,开发人员无须关注。可以使用长度操作符( # )获取字符串的长度(返回字符串占用的字节数,在某些编码中,这个值可能与字符串中字符的个数不同)。
代码语言:Bash


自动换行


AI代码解释






> print(#a)7> print(#"hello")5


可以使用连接操作符 . .(两个点)来进行字符串连接 如果操作数中存在数值,那lua 语言会先把数值转换成字符串。
代码语言:Bash


自动换行


AI代码解释






> "hello" .. "world"helloworld> "value is " .. 9value is 9


在 lua 语言中,字符串是不可变量,字符串连接总是创建一个新字符串,不会改变原来作为操作数的字符串:
代码语言:Bash


自动换行


AI代码解释






> a="hello "> a .. "world"hello world> print(a)hello


可以使用一对双引号或单引号来声明字符串常量。使用双引号和单引号声明字符串是等价的 它们两者唯一的区别在于,使用双引号声明的字符串中出现单引号时,单引号可以不用转义;使用单引号声明的字符串中出现双引号时,双引号可以不用转义。
Lua 语言中的字符串支持下列 语言风格的转义字符:
字符
含义
\a
响铃( bell)
\b
退格( back space )
\f
换页( for feed)
\n
换行( newline)
\r
回车( riage return )
\t
水平制表符( horizontal tab )
\v
垂直制表符( vertical tab )
\\
反斜杠( backslash )
\”
双引号( double quote )
\’
单引号( single quote )
此外,在字符串 中,还可以通过转义序列 \ddd 和\xhh 来声明字符。
像长注释 多行注释一样 ,可以使用一对双方括号来声明长字符串 多行字符串常量。方括号括起来的内容可以包括很多行,并且内容中的转义序列不会被转义 此外,如果多行字符串中的第一个字符是换行符,那么这个换行符会被忽略 多行字符串在声明包含大段代码的字符串时非常方便,例如:
展开代码语言:HTML


自动换行


AI代码解释






html=[[<html>        <head>                <title> HTML PAGE</title>        </head>        <body>                <a href="http://www.baidu.com">baidu</a>        </body></html>]]


Lua 语言在运行时提供了数值与字符串之间的自动转换,针对字符串的所有算术操作会尝试将字符串转换为数值 Lua 语言不仅仅在算术操作时进行这种强制类型转换,还会在任何需要数值的情况下进行。相反,当 Lua 语言发现在 要字符串的地方出现了数值时,它就会把数值转换为字符串。
2.5、function
Lua 语言中,函数( Function )是对语句和表达式进行抽象的主要方式,函数既可以用于完成某种特定任务,也可以只是进行一些计算然后返回计算结果。
Lua 既可以 Lua 语言编写 函数, 也可以调c语言编写的函数。
展开代码语言:Lua


自动换行


AI代码解释






function add(a)        local sum=0        for i=1,#a do                sum=sum+a        end        return sum;end


Lua 语言中一种与众不同但又非常有用的特性是允许一个函数返回多个结果。
展开代码语言:Lua


自动换行


AI代码解释






function maximum (a)         local mi = 1        local m = a[mi]        fo r i = 1, #a do                 if a > m then                         mi = i; m = a                 end         end         return m, mi --返回最大值及其索引end


Lua 语言中的函数可以是可变长参数函数,即可以支持数量可变的参数。
展开代码语言:Lua


自动换行


AI代码解释






function add ( ... )         local s = 0         for _, v in ipai { ... } do                 s = s + v         end         return send


2.6、table
表( Table )是 lua 语言中最主要和强大的数据结构 使用表, Lua语言可以以一种简单、统一且高效的方式表示数组、集合、记录和其他很多数据结构。Lua语言也使用表来表示包( package )和其他对象。
Lua 言中的表本质上是一种辅助数组,这种数组不仅可以使用数值作为索引,由可以使用字符串或其他任意类型的值作为索引( nil 除外)。
Lua 言中的表要么是值要么是变量 ,它们都是对象。使用构造器表达式创建表,其最简单的形式是 {}:
展开代码语言:Bash


自动换行


AI代码解释






> a={}> k="x"> a[k]=11> a[20]="great"> a["x"]11> k=20> a[k]great> a["x"]=a["x"]+11> a["x"]22


表永远是匿名的,表本身和保存表的变量之间没有固定的关系。对于一个表而言,当程序中不再有指向它的引用时,垃圾收集器会最终删除这个表并重用其占用的内存。
展开代码语言:Bash


自动换行


AI代码解释






> a = {} > a ["x"] = 10 > b = a > b["x"]10 > b["x"] = 20 > a["x"]20> a = nil > b = nil


同一个表中存储的值可以具有不同的 索引, 并可以按需增长以容纳新的元素。未经初始化的表元素为 nil ,将 nil 值给
表元素可以将其删除。
当把表当作结构体使用时, 可以把索引当作成员名称使用( a. name 等价于 a[“name”]。
表构造器( Table Constructor )是用来创建和初始化表的表达式,是 Lua 语言中独有
是最有用、最灵活的机制之一。
代码语言:Bash


自动换行


AI代码解释






> days ={"Sunday","Monday","Tuesday","Wednesday"}> print(days[2])Tuesday


lua 提供了一种初始化记录式表的特殊语法:
代码语言:Lua


自动换行


AI代码解释






a = {x = 10, y= 20}-- 等价于a = {} ; a.x = 10; a.y = 20


无论使用哪种方式创建表,都可以随时增加或删除表元素:
代码语言:Lua


自动换行


AI代码解释






w = {x = 0, y = 0, label ="hello world"}x = {math.sin(0), math.sin (1) , math.sin(2)}w[1] ="new" -- 把键1 增加到w表中w.x = nil        -- 删除字段‘x’


如果想表示常见的数组或列表,那么只需要使用整型作为索引的表即可。同时,也不需要预先声明表的大小,只需要直接初始化我们需要的元素即可:
代码语言:Lua


自动换行


AI代码解释






a={}for i=1,10 do        a=io.read()end


2.7、userdata
userdata 完全用户数据;指向一块内存的指针,通过为userdata 设置元表,lua 层可以使用该 userdata 提供的功能。userdata 为 lua 补充了数据结构,解决了 lua 数据结构单一的问题。可以在 c 中实现复杂的数据结构,生成库继而导出给 lua 使用。
注意:userdata 指向的内存需要由 lua 创建,同时 userdata 的销毁也交由 lua gc 来自动回收。
2.8、lightuserdata
lightuserdata是轻量用户数据。也是指向一块内存的指针,但是该内存由 c 创建,同时它的销毁也由 c 来完成。不能为它创建元表,轻量用户数据只有类型元表;通常用于 lua 想使用 c 的结构,但是不能让 lua 来释放的结构;在游戏客户端中用的比较多。
2.9、thread
线程(本质上是协程)。lua 中的协程和虚拟机都是 thread 类型。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表