目录
- 值和类型
- 子类型
- 类型字符串
- type (v)
值和类型
Lua是一种动态类型语言。这意味着变量没有类型;只有价值观才有意义。该语言中没有类型定义。所有值都有自己的类型。
Lua中的所有值都是一等值。这意味着所有的值都可以存储在变量中,作为参数传递给其他函数,并作为结果返回。
Lua中有八种基本类型:nil、boolean、number、string、function、userdata、thread和table。
类型nil只有一个值nil,它的主要属性是不同于任何其他值;它通常表示缺乏有用的价值。布尔类型有两个值,false和true。nil和false都使条件为假;它们统称为假值。任何其他值都使条件为真。尽管它的名字是false,但false经常被用作nil的替代品,关键的区别是false的行为就像表中的常规值,而表中的nil表示不存在的键。
类型number表示整数和实数(浮点数),使用两个子类型:integer和float。标准Lua使用64位整数和双精度(64位)浮点数,但您也可以编译Lua,使其使用32位整数和/或单精度(32位)浮点数。整数和浮点数的32位选项对于小型机器和嵌入式系统特别有吸引力。(参见luaconf.h文件中的LUA_32BITS宏)
除非另有说明,否则根据双补数算术的通常规则,在操作整数值时将出现溢出。(换句话说,实际结果是与数学结果模2n相等的唯一可表示整数,其中n是整数类型的位数。)
子类型
Lua对每个子类型的使用有明确的规则,但它也会根据需要在它们之间自动转换。因此,程序员可以选择忽略整数和浮点数之间的差异,或者完全控制每个数字的表示。
类型字符串
类型字符串表示不可变的字节序列。Lua是8位干净的:字符串可以包含任何8位值,包括嵌入的零(‘\0’)。Lua也是编码不可知论者;它对字符串的内容不做任何假设。Lua中任何字符串的长度必须适合Lua整数。
Lua可以调用(和操作)用Lua编写的函数和用C编写的函数。两者都由类型函数表示。
提供userdata类型以允许将任意C数据存储在Lua变量中。userdata值表示一块原始内存。有两种类型的userdata: full userdata,它是一个由Lua管理的内存块的对象;light userdata,它只是一个C指针值。Userdata在Lua中没有预定义的操作,除了赋值和身份测试。通过使用元表,程序员可以为完整的userdata值定义操作(参见§2.4)。用户数据值不能在Lua中创建或修改,只能通过C API。这保证了主程序和C库拥有的数据的完整性。
thread类型代表独立的执行线程,它被用来实现协程。Lua线程与操作系统线程无关。Lua支持所有系统上的协程,即使是那些本身不支持线程的系统。
类型表实现了关联数组,也就是说,数组不仅可以将数字作为索引,还可以将除nil和NaN以外的任何Lua值作为索引。(Not a Number是IEEE 754标准使用的特殊浮点值,用于表示未定义的数字结果,例如0/0。)表可以是异构的;也就是说,它们可以包含所有类型的值(nil除外)。任何与值nil相关联的键都不被认为是表的一部分。相反,任何不属于表的键都有一个关联值nil。
表是Lua中唯一的数据结构机制;它们可以用来表示普通的数组、列表、符号表、集合、记录、图形、树等。为了表示记录,Lua使用字段名作为索引。该语言通过提供a.name作为[“name”]的语法糖来支持这种表示。有几种方便的方法可以在Lua中创建表。
与索引一样,表字段的值可以是任何类型。特别是,由于函数是一等值,表字段可以包含函数。因此表也可以携带方法
表的索引遵循语言中原始相等的定义。
表达式a[i]和a[j]表示相同的表元素,当且仅当i和j是原始相等的(即在没有元方法的情况下相等)。特别是,带有整数值的浮点数等于它们各自的整数(例如,1.0 == 1)。为了避免歧义,任何用作键的等于整数的浮点数都被转换为该整数。例如,如果您写入a[2.0] = true,则插入到表中的实际键将是整数2。
表、函数、线程和(完整的)userdata值都是对象:变量实际上不包含这些值,只包含对它们的引用。
赋值、参数传递和函数返回总是对这些值的引用进行操作;这些操作并不意味着任何类型的复制。
type (v)
返回其唯一参数的类型,编码为字符串。这个函数可能的结果是“nil”(字符串,而不是值nil)、“number”、“string”、“boolean”、“table”、“function”、“thread”和“userdata”。