《lua程序设计》读书笔记 第二章:类型与值

来源:互联网 发布:动态截图软件 编辑:程序博客网 时间:2024/05/21 15:46

lua是一种动态类型的语言。
在lua中有8中基础类型:nil(空)、boolen、number、string、userdata(自定义类型)、function、thread、table。函数type可根据一个值返回其类型名称,其返回值为string。

    print(type("hello world"))                  -->string    print(type(10.4 * 3))                       -->number    print(type(type))                           -->function    print(type(true))                           -->boolen    print(type(nil))                            -->nil    print(type(type(x))                         -->string

注意在lua中,函数是作为“第一类值”来看待的,所以可以像操作其他值一样来操作一个function。

2.1 nil(空)

nil是一种类型,它只有一个值nil,它的主要功能是用于区别其他任何值。

2.2 boolen(布尔)

boolen类型有两个可选值:false,true。
在lua中任何值都可以表示一个条件。Lua将false和nil视为false,其他所有的值均视为true,特别注意,数字0和空字符串也都视为true。

2.3 number(数字)

number用于表示实数。Lua中没有整数类型,其使用双精度来表示一个整数,因此其可以精确表示任何32位的整数,而不会出现“四舍五入”的情况。所以Lua中的整数运算是准确的,但是要注意的是,如果整数运算中牵扯到小数,则结果就会变得不再准确,可能存在误差,如下:

local a =0.1 * 0.1 * 10000local b = 10000print(b%a)              -->99.999999(输出并不为0)

Lua支持科学计数法:

4.57e-3, 0.3e12

2.4 string

2.4.1 编码

Lua中的字符串通常表示“一个字符序列”。Lua完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数字0,也就是说,可以将一个任意二进制数据存储在一个字符串。
Lua的字符串是不可变的值,不能像在c语言中直接修改字符串的某个字符,而是应该根据修改要求创建一个新的字符串。
Lua自动管理字符串的内存,Lua能够高效的处理长字符串。
Lua中有与c语言类似的转义序列,如“\n””\t”。

2.4.2 方括号表示字符串

在Lua中,还可以用一对匹配的双方括号来界定一个字母字符串,就像写块注释一样,这样形式书写的字符串可以延伸多行,Lua不会解释其中的转义序列。此外,如果字符串的第一个字符是换行,那么Lua会忽略它,这种写法对于含程序代码的字符串尤为有用,比如html,如下:

page=[[<html><head><title>An HTNL Page<title></head><body><a herf="http://www.lua.org">Lua</a></body></html>]]write(page)

有时字符串中需要包含这样的内容:a=b[c[i]]

page = [[a= b[c[i]]]]    -->这样方括号匹配会发生错误

为了解决这种情况,可以在两个左方括号间加任意数量的等号,则字符串只用在遇到含有等量数量等号的右方括号时才会结束。这套机制同样适用于注释。

page = [==[a=b[i]]]==]

2.4.3 数字与字符串的转换

Lua提供了运行时的数字与字符串的自动转换。在一个字符串上应用算数操作时,Lua会尝试将其装换为一个数字:

print("10" + 1)     -->11print(10 + 1")      -->10 + 1print("hello" + 1)  -->错误,“hello world”不能转换为数字

相反,在Lua期望字符串的时候,它也会将数字转换为字符串:

print(10 .. 20)        -->1020

“..”为字符串连接符,要注意的是直接在一个数字后面使用字符串连接符,必须要用一个空格分割它们,否则,Lua会将第一个点理解为小数点。
在日常使用中,最好不要依赖于上述两种隐式转换,有时我们可以使用显式转换如tonumber(将字符串转换为number,如果转换失败,则返回nil)以及tostring(将一个number转换为string)

2.4.4 井号(#)的使用

在Lua5.1中,可以在字符串前放置“#”来获取字符串的长度:

a = "hello"print(#a)       -->5

2.5 table(表)

table类型实现了“关联数组”,在Lua中,可以通过除nil以外的所有值来索引table。此外table没有固定大小。基于table,可以以一种简单、统一、高效的方式表示数组、符号表、集合、记录、队列等数据结构。另外,Lua也是通过table来表示模块(module)、包(package)和对象(object)的。
在Lua中,table既不是值也不是变量,其是对象。table永远是匿名的,一个持有table的变量实际是一个引用,其与table自身之间没有固定的关联性。

a = {}a["x"] = 10b = a           -->b与a引用了同一个tableprint(b["x"])       -->10

当一个程序再也没有对一个table的引用时,Lua的垃圾收集器最终将删除该table,并复用它的内存。
当table中某个元素没有初始化时,它的内容为nil。
table为字符串索引提供了一种简便的语法糖,即a[“x”]等价于a.x。要特别注意a.x,a[x],a[“x”]这三者的区别,a.x是与a[“x”]等价而不是a[x]。

a = {}x = "y"a[x] = 10print(a.x)      -->nil (等价于a["x"])print(a.y)      -->10(等价于a["y"])print(a[x])         -->10(由于x = "y", 故a[x]等价于a["y"])

2.5.2 table表示数组

对Lua的习惯而言,数组通常以1作为索引的起始值。Lua5.1中,长度操作符用于返回数组或者线性表中的最后一个索引值。
要注意的是#号并不一定返回一个数组的长度,因为所有未初始化的元素的索引结果都是nil,Lua将nil作为界定数组结尾的标志,当一个数组中间有nil值时,长度操作符会将这些nil元素视为数组的结尾标记。可以使用table.maxn,它将返回一个table的最大正索引值。

a = {1, 2, 3, 4, 5, 6}a[10] = 10print(#a)       --> 6print(table.maxn(a))    --> 10

2.6 function

在第六章详细介绍

2.7userdata和thread

userdata可以将任意c语言数据存储在Lua变量中,在Lua中这种类型没有太多的预定义操作, 只能进行赋值和相等性测试。
thread将在第九章解释。

原创粉丝点击