Lua 数据类型

Lua数据类型

Lua是动态类型的语言,即一个变量不被约束为单一类型,可以赋不同的类型值。

Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。

数据类型

描述

nil

这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。

boolean

包含两个值:false和true。

number

表示双精度类型的实浮点数

string

字符串由一对双引号或单引号来表示

function

由C或Lua编写的函数

userdata

表示任意存储在变量中的C数据结构

thread

表示执行的独立线程,用于执行协同程序

table

Lua中的表(table)其实是一个"关联数组"(associativearrays),数组的索引可以是数字或者是字符串

可以通过type()函数获取变量的类型。

print(type(nil))--nilprint(type("Helloworld"))--stringprint(type(10.4*3))--numberprint(type(print))--functionprint(type(type))--functionprint(type(true))--booleanprint(type(type(X)))--string
nil

nil是一个空值,和C语言中的null类似,一个未定义的变量的值为nil,将一个变量赋值为nil表示显式地将变量删除。

print(type(a))--输出:nillocalb=''b=nil--显式地删除变量b,把b交给垃圾回收器。
boolean

boolean类型只有两个可选值:true(真)和false(假),Lua把false和nil看作是"假",其他的都为"真"。

number(数字)

Lua默认只有一种number类型--double(双精度)类型(默认类型可以修改里的定义),支持科学记数法书写的常量,也支持0x开头形式的十六进制表示。以下几种写法都被看作是number类型:

print(type(2))--number整型print(type(2.2))--number浮点数print(0x2b)--43print(2^3)--指数表示8print(1.2e+1)--1.2*10^1==12print(1.2e-2)--0.012print(0.1+0.2==0.3)--false浮点数的运算不精确

同其他语言,浮点数的运算不精确。

表示范围

整型:标准Lua用64个比特位来存储整型值,最大值为2^63-1。

浮点数:标准Lua使用64个比特位表示所有数值,其中11位为指数,表示范围从-10^308到10^38。

string(字符串)

字符串由一对双引号或单引号来表示,也可以用2个方括号[[]]来表示跨行字符串。

string1=""string2=''string3=[[]]string4=[[]]string5=[[]]print(是取长度符号,19print(string5)--20,多出了最后一个\n,后面的换行是字符串的一部分print(string3==string5)--falseprint(string3.."\n"==string5)--true两个点表示字符串拼接string6=(string1,'daemoncoder','DaemonCoder')print(string1)--的值没有被改变print(string6)--

取长度时变量的值不能是nil,不然会直接报错:

string1=nilprint(1to'len'(stringexpected,gotnil)stacktraceback:[builtin:len]:infunction'len'learning/lua_learning/:8:inmainchunk[C]:at0x0107ded1f0

两个点用于两个字符串的拼接,注意这里和其他用+拼接字符串的语言不同,在Lua中字符串相加会把字符串转成数字然后计算数值,如果转不成合法数值会直接报错:

print("1"+"2")--3print("1"+2)--3print("1.1+"1")--2.1print("2e3"+"1")--2001print("2e-1"+"1")--1.2print("1"+'a')--attempttoperformarithmeticonastringvalue--stacktraceback:--learning/lua_learning/:9:inmainchunk--[C]:at0x01013ed1f0

Lua语言中字符还可以用C风格的转义字符(和PHP不同,单引号和双引号定义的字符串没有区别,都可以用转义字符),还可以通过转义序列\ddd和\xhh用十进制和十六进制表示ascii字符,ddd是由最多3个十进制数字(0-9)组成,hh是由两个且必须是两个十六进制数字(0-f)组成。

print("\65\t\065\t\x41\n")--AAA(换行)

Lua字符串一般是按单字节计算的,如"汉字")--6print(("汉字"))--6print(("汉字"))--2table(表)

Lua中的表(table)其实是一个"关联数组"(associativearrays),数组的索引可以是数字或者是字符串。

localt={'a',name='','b',age=18,['helloworld']='cool',}print(t[1])--aprint(t['1'])--nilprint(t['name'])--(t[2])--bprint()--18print(t['helloworld'])--cool

Lua表的索引是从1开始的,习惯了其他编程语言从0开始的奇葩设计,反而感觉Lua比较奇葩有木有。

如上例,表用{}来定义,键值都可以是任意类型,甚至可以是一个table:

t1={}t2={}t2[t1]=''print(t2[t1])--(t2['t1'])--nilprint()--nil

不同字符串、数值等的比较,只要变量内容相同就是变量相等,table的相等判断是根据变量指向的内存位置比较的,多个table即使内容相同比较结果也是不相等。

s1=''

s2=''

print(s1==s2)--true

t1={}

t2={}

print(t1==t2)--false

print({}=={})--false

上面示例说明table是一种动态分配的对象,类似的,table的赋值操作也是和指针类似:

t3={}t4==''print()--和t4指向同一块内存,修改t4的值,t3也受影响t4=nil--删除t4不会影响t3,相当于t4不再指向原来的那块内存,但是t3还是指向原来的内存print()--

原文地址:

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐