第二章 类型与值
1. Lua是一种动态类型的语言。在语言中没有类型定义的语法,每个值都携带了它自身的类型信息。在Lua中有8中基础类型:nil、boolean、number、string、userdata、function、thread和table。函数type可以根据值返回其类型名称。
2. 一个全局变量在第一次赋值前的默认值就是nil,将nil赋予一个全局变量等同于删除它。
3. Lua将false和nil视为“假”,而将除此之外的其他值视为“真”。Lua在条件测试中,将数字零和空字符串也都视为“真”。
4. number类型用于表示实数。Lua没有整数类型,因为没有必要。
5. Lua的字符串是不可变的值,不能直接修改,而是应该根据修改要求来创建一个新的字符串。Lua的字符串和其他Lua对象(例如table或函数等)一样都是自动内存机制所管理的对象。
6. 可以用一对匹配的双方括号“[[”来界定一个字母字符串,以这种形式书写的字符串可以延伸多行,Lua不会解释其中的转义序列。可以在字符串前放置“#”来获取该字符串的长度。
7. table实现了关联数组,关联数组是一种具有特殊索引力的数组。不仅可以通过整数来索引它,还可以使用字符串或其他类型的值(除了nil)来索引它。Lua也是通过table来表示模块(module)、包(package)和对象(object)的。当输入io.read的时候,其含义是“io模块中的read函数”。对于Lua而言,这表示“使用字符串“read”作为key来索引table io”。
8. 可以将table想象成一种动态分配的对象,程序仅持有一个对他的引用,Lua不会暗中产生table的副本或创建新的table。table的创建时通过构造表达式完成的,最简单的构造表达式是{}。
9. table永远是匿名的,一个持有table的变量与table自身之间没有固定的关联性。当一个程序再也没有对一个table的引用时,Lua的垃圾收集器会删除该table,并复用它的内存。
10. 为了表示一条记录,可以将字段名作为索引。Lua对诸如a["name"]的写法提供了一种更简便的语法糖,可以直接输入a.name。
11. 长度操作符“#”用于返回一个数组或线性表的最后一个索引值(或为其大小)。
12. 所有未初始化的元素的索引结果都是nil。Lua将nil作为界定数组结尾的标志。当一个数组中有“空隙(Hole)”时,即中间含有nil时,长度操作符会认为这些nil元素就是结尾标记。如果真的要处理那些含有空隙的数组,可以使用函数table.maxn,它将返回一个table的最大正索引数。