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)实在是一个\公众关联数组\"大众(associative arrays),数组的索引可以是数字或者是字符串
可以通过type()函数获取变量的类型。
print(type(nil)) -- nilprint(type(\"大众Hello world\"大众)) -- stringprint(type(10.43)) -- numberprint(type(print)) -- functionprint(type(type)) -- functionprint(type(true)) -- booleanprint(type(type(X))) -- stringnil
nil是一个空值,和C措辞中的null类似,一个未定义的变量的值为nil,将一个变量赋值为nil表示显式地将变量删除。
print(type(a)) -- 输出:nillocal b = 'www.daemoncoder.com'b = nil -- 显式地删除变量b,把b交给垃圾回收器。boolean
boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是\"大众假\"大众,其他的都为\公众真\"大众。
number(数字)Lua 默认只有一种 number 类型 -- double(双精度)类型(默认类型可以修正 luaconf.h 里的定义),支持科学记数法书写的常量,也支持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 = \公众www.daemoncoder.com\公众string2 = 'www.daemoncoder.com'string3 = [[www.daemoncoder.com]]string4 = [[www.daemoncoder.com]]string5 = [[www.daemoncoder.com]]print(#string3) -- #是取长度符号,19print(#string4) -- 19,www.daemoncoder.com前面的换行不包含在字符串中print(string3 == string4) -- trueprint(#string5) -- 20,多出了末了一个\n,后面的换行是字符串的一部分print(string3 == string5) -- falseprint(string3 .. \"大众\n\公众 == string5) -- true 两个点表示字符串拼接string6 = string.gsub(string1, 'daemoncoder', 'DaemonCoder')print(string1) -- www.daemoncoder.com string1的值没有被改变print(string6) -- www.DaemonCoder.com
#表示取字符串的长度,把稳用#取长度时变量的值不能是nil,不然会直接报错:
string1 = nilprint(#string1)... bad argument #1 to 'len' (string expected, got nil)stack traceback:[builtin:len]: in function 'len'learning/lua_learning/tmp.lua:8: in main chunk[C]: at 0x0107ded1f0
两个点用于两个字符串的拼接,把稳这里和其他用+拼接字符串的措辞不同,在Lua中字符串相加会把字符串转成数字然后打算数值,如果转不成合法数值会直接报错:
print(\"大众1\"大众 + \"大众2\公众) -- 3print(\公众1\"大众 + 2) -- 3print(\公众1.1 + \"大众1\公众) -- 2.1print(\"大众2e3\"大众 + \公众1\"大众) -- 2001print(\"大众2e-1\公众 + \"大众1\公众) -- 1.2print(\"大众1\公众 + 'a')-- ... attempt to perform arithmetic on a string value-- stack traceback:-- learning/lua_learning/tmp.lua:9: in main chunk-- [C]: at 0x01013ed1f0
Lua措辞中字符还可以用C风格的转义字符(和PHP不同,单引号和双引号定义的字符串没有差异,都可以用转义字符),还可以通过转义序列\ddd和\xhh用十进制和十六进制表示ascii字符,ddd是由最多3个十进制数字(0-9)组成,hh是由两个且必须是两个十六进制数字(0-f)组成。
print(\"大众\65\t\065\t\x41\n\"大众) -- A A A(换行)
Lua字符串一样平常是按单字节打算的,如 #\"大众汉字\公众 的结果是6,Lua5.3引入了utf8标准库
print(#\公众汉字\公众) -- 6print(string.len(\"大众汉字\"大众)) -- 6print(utf8.len(\"大众汉字\"大众)) -- 2table(表)
Lua 中的表(table)实在是一个\公众关联数组\公众(associative arrays),数组的索引可以是数字或者是字符串。
local t = { 'a', name = 'www.daemoncoder.com', 'b', age = 18, ['hello world'] = 'cool',}print(t[1]) -- aprint(t['1']) -- nilprint(t['name']) -- www.daemoncoder.comprint(t[2]) -- bprint(t.age) -- 18print(t['hello world']) -- cool
Lua表的索引是从1开始的,习气了其他编程措辞从0开始的奇葩设计,反而觉得Lua比较奇葩有木有。
如上例,表用{}来定义,键值都可以是任意类型,乃至可以是一个table:
t1 = {}t2 = {}t2[t1] = 'www.daemoncoder.com'print(t2[t1]) -- www.daemoncoder.com print(t2['t1']) -- nilprint(t2.t1) -- nil
不同字符串、数值等的比较,只要变量内容相同便是变量相等,table的相等判断是根据变量指向的内存位置比较的,多个table纵然内容相同比较结果也是不相等。
s1 = 'www.daemoncoder.com'
s2 = 'www.daemoncoder.com'
print(s1 == s2) -- true
t1 = {}
t2 = {}
print(t1 == t2) -- false
print({} == {}) -- false
上面示例解释table是一种动态分配的工具,类似的,table的赋值操作也是和指针类似:
t3 = {}t4 = t3t4.name = 'www.daemoncoder.com'print(t3.name) -- www.daemoncoder.com t3和t4指向同一块内存,修正t4的值,t3也受影响t4 = nil -- 删除t4不会影响t3,相称于t4不再指向原来的那块内存,但是t3还是指向原来的内存print(t3.name) -- www.daemoncoder.com
原文地址:https://www.daemoncoder.com/a/Lua%20%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/4d54413d