花生肉泥 Blog

Lua值与类型

2016/11/07 Share

Lua基础语法之值与类型

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

1
2
3
4
5
6
7
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(nil)) -- nil
print(type(type(X))) -- string

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])) -- string
print(type(t[5])) -- boolean
print(type(t[7])) -- tbale

CATALOG
  1. 1. Lua基础语法之值与类型
    1. 1.1. nil类型
    2. 1.2. boolean类型
    3. 1.3. number类型
    4. 1.4. string类型
    5. 1.5. funciton类型
    6. 1.6. userdata类型
    7. 1.7. thread类型
    8. 1.8. table类型
    9. 1.9. 获取变量类型的函数