Lua值与类型 · 花生肉泥
Lua基础语法之值与类型
Lua是一种动态类型语言。这意味着变量没有类型,只有值才有类型,所有的值都可以被放在变量里,当做参数传递到另一个函数中,并被函数作为结果返回。
1 | print(type("hello world")) |
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 | print("100"+"200") -- 300 |
反过来,当lua期望一个string而碰到数字时,会将数字转成string
1 | print("hello".. 1 .."world") --hello 1 world |
尽管字符串和数字时可以自动转换,但两者是不同的,像10 == “10”这样的比较永远是错的。
如果需要显示将string转成数字可以使用函数tonumber(),如果string不是正确的数字该函数将返回nil,反之,可以调用tostring()将数字转成字符串
1 | print(tostring(10) == "10") -- true |
1 | local n,s = 111,"111" |
funciton类型
lua可以调用lua或者C实现的函数,lua所有标准库都是用C实现的,标准库包括string库,table库,I/O库、OS库、math库、debug库
函数是第一类型(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值(函数名和函数加括号的不同)
1 | funciton f1() |
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 | local t = {1,2,"a","b",true,false,{a}} |
获取变量类型的函数
type可以返回一个描述给定值的类型的字符串
1 | local t = {1,2,"a","b",true,flase,{a}} |