Lua值与类型 · 花生肉泥

2.7k 词

Lua基础语法之值与类型

Lua是一种动态类型语言。这意味着变量没有类型,只有值才有类型,所有的值都可以被放在变量里,当做参数传递到另一个函数中,并被函数作为结果返回。

1
2
3
4
5
6
7
print(type("hello world"))     
print(type(10.4*3)) -- number
print(type(print)) -- function
print(type(type)) -- function
print(type(true)) -- boolean
print(type(nil)) -- nil
print(type(type(X)))

Lua中有八种基本类型分别为:

nil、boolean、number、string、function、userdata、thread和table

nil 只有值nil属于该类,表示一个无效值,在条件表达式中相当于false
boolean 包含两个值:false和true
number 表示双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
funciton 由C或者Lua编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线程,用于执行协同程序
table lua中的表table其实是一个”关联数组”asociative arrays,数组的索引可以是数字或者字符串,在lua里,table的创建是通过”构造表达式”来完成,最简单构造表达式是{}、用来创建一个空格

nil类型

nil类型只有一种值nil,它的主要用途,在于表识和别的任何值的差异;通常,当需要描述一个无意义的值得时候会用到它

boolean类型

boolean只有两种值:false和true,nil和false都能导致条件为假,而另外所有的值都被当做真,lua中认为0和空字符串都为真

number类型

number只表示实数,lua中没有整形
编译lua时,可以使用长整数或者单精度浮点型代替数值类型,可以支持到小数点后15位

string类型

string指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。

这意味着你可以存储任意的二进制数据在一个字符串里,lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串

string和其他对象一样,lua自动进行内存分配和释放,一个string可以只包含一个字母也可以包含一本书,lua可以高效的处理长字符串,1M的string在lua中很是常见。可以使用单引号或者双引号表示字符串

自动换算:

运行时,lua或自动在string和number之间自动进行类型转换,当一个字符串使用算术操作符时,string就会被转成数字。

1
2
3
print("100"+"200")     -- 300
print("100"+1) -- 101
print("100+200") -- 100+200

反过来,当lua期望一个string而碰到数字时,会将数字转成string

1
2
3
print("hello".. 1 .."world")     --hello 1 world
print("hello".. 1 .."world") --hello 1 world
print("hello".. 1.."world") -- 编译出错,当在一个数字后面写..时,必须加上空格以防止被解释错。

尽管字符串和数字时可以自动转换,但两者是不同的,像10 == “10”这样的比较永远是错的。
如果需要显示将string转成数字可以使用函数tonumber(),如果string不是正确的数字该函数将返回nil,反之,可以调用tostring()将数字转成字符串

1
2
print(tostring(10) == "10")     -- true
print(10 .. "" == "10") -- true

1
2
3
4
local n,s = 111,"111"
print(type(n),type(s)) -- number string
n,s = tostring(n),tonumber(s)
print(type(n),type(s)) -- string number

funciton类型

lua可以调用lua或者C实现的函数,lua所有标准库都是用C实现的,标准库包括string库,table库,I/O库、OS库、math库、debug库

函数是第一类型(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值(函数名和函数加括号的不同)

1
2
3
4
5
6
7
8
funciton f1()
return true
end

local a = f1
local b = f1()
print(a) --function:006AB730
print(b) --true

userdata类型

userdata类型用来将任意C数据保存在lua变量中,userdata在lua中除了赋值和相等比较外没有预定义的操作。lua可以调用lua或者C是闲的函数,lua所有标准库都是用C实现的。

thread类型

thread类型用来区别独立的执行现场

table类型

关联数组可以用任何东西(除了nil)做索引,而不限于数字。table可以以不同类型的值构成,它可以包含所有的类型的值(除nil外)。table是lua中唯一的一种数据结构

支持以a.name的形式表示a[“name”],跟索引一样,table每个域中的值也可以是任何类型(除nil以外)。特别的,因为函数本身也是值,所以table的域中也可以放函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
local t = {1,2,"a","b",true,false,{a}}
print("表长"..#t)
for k,v in ipairs(t) do
print k,v
end

=====结果=====
表长7
1 1
2 2
3 a
4 b
5 true
6 false
7 table:001EB048

获取变量类型的函数

type可以返回一个描述给定值的类型的字符串

1
2
3
4
5
local t = {1,2,"a","b",true,flase,{a}}
print(type(t[1])) -- number
print(type(t[3]))
print(type(t[5])) -- boolean
print(type(t[7])) -- tbale