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)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串

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

print(type(nil))              -- nil
print(type("Hello world")) -- string
print(type(10.4*3)) -- number
print(type(print)) -- function
print(type(type)) -- function
print(type(true)) -- boolean
print(type(type(X))) -- string

nil

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

print(type(a))      -- 输出:nil
local 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) -- 43
print(2^3) -- 指数表示 8
print(1.2e+1) -- 1.2 * 10 ^ 1 == 12
print(1.2e-2) -- 0.012
print(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) -- #是取长度符号,19
print(#string4) -- 19,www.daemoncoder.com前面的换行不包含在字符串中
print(string3 == string4) -- true
print(#string5) -- 20,多出了最后一个\n,后面的换行是字符串的一部分
print(string3 == string5) -- false
print(string3 .. "\n" == string5) -- true 两个点表示字符串拼接

string6 = string.gsub(string1, 'daemoncoder', 'DaemonCoder')
print(string1) -- www.daemoncoder.com string1的值没有被改变
print(string6) -- www.DaemonCoder.com

#表示取字符串的长度,注意用#取长度时变量的值不能是nil,不然会直接报错:

string1 = nil
print(#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")        -- 3
print("1" + 2) -- 3
print("1.1 + "1") -- 2.1
print("2e3" + "1") -- 2001
print("2e-1" + "1") -- 1.2
print("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(#"汉字")                -- 6
print(string.len("汉字")) -- 6
print(utf8.len("汉字")) -- 2

table(表)

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

local t = {
'a',
name = 'www.daemoncoder.com',
'b',
age = 18,
['hello world'] = 'cool',
}
print(t[1]) -- a
print(t['1']) -- nil
print(t['name']) -- www.daemoncoder.com
print(t[2]) -- b
print(t.age) -- 18
print(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']) -- nil
print(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 = t3
t4.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

↓点我看原文,更多内容,更舒服的排版哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值