Lua教程(三):值与类型介绍
Lua是一种动态类型语言。这意味着变量没有类型,只有值才有类型。语言中不存在类型定义。而所有的值本身携带它们自己的类型信息。
Lua中的所有值都是一致(first-class)的。这意味着所有的值都可以被放在变量里,当作参数传递到另一个函数中,并被函数作为结果返回。
Lua中有八种基本类型:nil,boolean,number,string,function,userdata,thread,andtable.Nil类型只有一种值nil,它的主要用途用于标表识和别的任何值的差异;通常,当需要描述一个无意义的值时会用到它。Boolean类型只有两种值:false和true。nil和false都能导致条件为假;而另外所有的值都被当作真。Number表示实数(双精度浮点数)。(编译一个其它内部数字类型的Lua解释器是件很容易的事;比如把内部数字类型改作单精度浮点数或长整型。参见文件luaconf.h。)String表示一串字符的数组。Lua是8-bitclean的:字符串可以包含任何8位字符,包括零结束符(‘\0′)(参见§2.1)。
Lua可以调用(和处理)用Lua写的函数以及用C写的函数(参见§2.5.8).
userdata类型用来将任意C数据保存在Lua变量中。这个类型相当于一块原生的内存,除了赋值和相同性判断,Lua没有为之预定义任何操作。然而,通过使用metatable(元表),程序员可以为userdata自定义一组操作(参见§2.8)。userdata不能在Lua中创建出来,也不能在Lua中修改。这样的操作只能通过CAPI。这一点保证了宿主程序完全掌管其中的数据。
thread类型用来区别独立的执行线程,它被用来实现coroutine(协同例程)(参见§2.11)。不要把Lua线程跟操作系统的线程搞混。Lua可以在所有的系统上提供对coroutine的支持,即使系统并不支持线程。
table类型实现了一个关联数组。也就是说,数组可以用任何东西(除了nil)做索引,而不限于数字。table可以以不同类型的值构成;它可以包含所有的类型的值(除nil外)。table是lua中唯一的一种数据结构;它可以用来描述原始的数组、符号表、集合、记录、图、树、等等。用于表述记录时,lua使用域名作为索引。语言本身采用一种语法糖,支持以a.name的形式表示a["name"]。有很多形式用于在lua中创建一个table(参见§2.5.7)。
跟索引一样,table每个域中的值也可以是任何类型(除nil外)。特别的,因为函数本身也是值,所以table的域中也可以放函数。这样table中就可以有一些methods了(参见see§2.5.9)。
table,function,thread,和(full)userdata这些类型的值是所谓的对象:变量本身并不会真正的存放它们的值,而只是放了一个对对象的引用。赋值,参数传递,函数返回,都是对这些对象的引用进行操作;这些操作不会做暗地里做任何性质的拷贝。
库函数type可以返回一个描述给定值的类型的字符串。
Lua提供运行时字符串到数字的自动转换。任何对字符串的数学运算操作都会尝试用一般的转换规则把这个字符串转换成一个数字。相反,无论何时,一个数字需要作为字符串来使用时,数字都会以合理的格式转换为字符串。需要完全控制数字怎样转换为字符串,可以使用字符串库中的format函数(参见string.format)。