<Lua程序设计(第二版)>书摘-1

来源:互联网 发布:科学管理案例 知乎 编辑:程序博客网 时间:2024/05/01 08:26

下述资料摘自<Lua程序设计(第二版)>

Lua有8种基础类型
nil         空值
boolean     布尔值
number      数字
string      字符串
userdata    自定义类型
function    函数
thread      线程
table       表



nil(空)
nil是一种类型,它只有一个值nil,它的主要功能是用于区别其他任何值。如一个全局变量在第一次赋值前的默认值就是nil,将nil赋予一个全局变量赞同于删除它。Lua将nil用于表示一种"无效值(non-value)"的情况,即没有任何有效值的情况。


boolean(布尔)
boolean类型有两个可选值:false和true,这与传统的布尔值一样。然而boolean却不是一个条件值的唯一表示方式。在Lua中任何值都可以表示一个条件。Lua将值false和nil视为"假",而将除此之外的其他值视为"真"。请注意,还有一点不同于某些脚本语言,Lua在条件测试中,将数字零和空字符串也都视为"真"。


number(数字)
number类型用于表示实数。Lua没有整数类型,因为没有必要。一直以来都存在着一个关于浮点数算术错误的误解。有人会担心即使对浮点数进行一个简单的递增运算都有可能导致错误的结果。而事实上,只要使用双精度来表示一个整数,就不会出现"四舍五入"的错误。因此,Lua中的数字可以表示像任何32位整数,而不会产生四舍五入的错误。
书写一个数字常量时,可以使用普通的写法,也可以使用科学计数法,以下是一些合法的数字常量:
4   0.4 4.57e-3 0.3e12  5e+20


string(字符串)
Lua中的字符串通常表示"一个字符序列"。Lua完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数值0。也就是说,可以将任意二进制数据存储到一个字符串中。
Lua的字符串是不可变的值。不能像在c语言中那样直接修改字符串的某个字符,而是应该根据修改要求来创建一个新的字符串。如下所示:
a = "one string"
b = string.gsub(a,"one","another") --修改字符串的一部分
print(a) -->one string
print(b) -->another string
Lua的字符串和其他Lua对象(例如table或函数等)一样,都是自动内存管理机制所管理的对象。这表示无须担心字符串的分配和释放,Lua帮你处理这些事情。一个字符串可以小到只包含一个字母,也可以大到包含整本书。一个字符串可以小到只包含一个字母,也可以大到包含整本书。Lua能够高效地处理长字符串。在Lua程序中操作100K或1M的字符串是很常见的。
字面字符串需要以一对匹配的单引号来双引号来界定:
a = "a line"
b = 'another line'
可以用一对匹配的双方括号来界定一个字母字符串,就像写"块注释"那样。以这种形式书写的字符串可以延伸多行,Lua不会解释其中的转义序列。此外,如果字符串的第一个字符是一个换行符(new line),那么Lua会忽略它。这种写法对于书写那种含有程序代码的字符串尤为有用。如下例:
page = [[
<html>
<head>
<title>An HTML Page</title>
</head>
<body>
<a href="http://www.lua.org">Lua</a>
</body>
</html>
]]
write(page)
如此便简化了注释那些"已经包含了注释块"的代码
Lua提供了运行时的数字与字符串的自动转换。在一个字符串上应用算术操作时,Lua会尝试将这个字符串转换成一个数字:
print("10" + 1)     -->11
print("10 + 1")     -->10 + 1
print("hello" + 1)  --错误(不能转换"hello")
Lua不仅在算术操作中会施以这种强制转换,还会在其他任何需要数字地方这么做。
在Lua中,".."是字符串连接操作符。当直接在一个数字后面输入它的时候,必须要用一个空格来分隔它们。不然,Lua会将第一个点理解为一个小数点。
在Lua5.1中,可以在字符串前放置操作符"#"来获得该字符串的长度:
a = "hello"
print(#a)           -->5
print(#"good\0bye") -->8


table(表)
table类型实现了"关联数组"。tabl没有固定的大小,可以动态地添加数量的元素一个table中。table是Lua中主要的数据结构机制,具有强大的功能。基于table,可以以一种简单、统一和高效的方式来表示普通数组、符号表、集合、记录、队列和其他数据结构。Lua也是通过table来表示模块、包和对象的。当输入io.read时,其含义是"io模块中的read函数"。对于Lua而言,这表示使用字符串"read"作为key来索引table io。
在Lua中,table既不是"值"也不是"变量",而是"对象"。可以将一个table想象成一种动态分配的对象,程序仅持有一个对它们的引用,Lua不会暗中产生table的副本或创建新的table。此外,在Lua中也不需要声明一个table。事实上也没有办法可以声明table。table的创建是通过"构造表达式"完成的,最简单的构造表达式就是{}。
a = {}      --创建一个table,并将它的引用存储到a
k = "x"
a[k] = 10   --新条目,key="x",value=10
a[20] = "great" --新条目,key=20,value="great"
print(a["x"])   -->10
k = 20
print(a[k])     -->"great"
table永远是"匿名的",一个持有table的变量与table自身之间没有固定的关联性。
a = {}
a["x"] = 10
b = a       --b与a引用了同一个table
print(b["x"]) -->10
b["x"] = 20
print(a["x"])   -->20
a = nil         --现在只有b还在引用table
b = nil         --再也没有对table的引用了
当一个程序再也没有对一个table的引用时,Lua的垃圾收集器(garbage collector)最终会删除该table,并复用它的内存。
所有table都可以用不同类型的索引来访问value(值),当需要容纳新条目时,table会自动增长。
a = {}
--创建1000个新条目
for i = i,1000 do a[i] = i*2 end
print(a[9]) -->18
a["x"] = 10
print(a["x"])   -->10
print(a["y"])   -->nil,注意:当table的某个元素没有初始化时,它的内容就为nil,同样也可将nil赋予table中的某个元素来删除该元素
易错点:
a = {}
x = "y"
a[x] = 10           --将10放入字段"y"
print(a[x]) -->10   --字段"y"的值
print(a.x)  -->nil   --字段"x"(未定义)的值
print(a.y)  -->10   --字段"y"的值
若要表示一个传统的数组或线性表,只需以整数作为key来使用table即可:
--读取10行内容,并存储到一个table中
a = {}
for i=1,10 do
a[i] = io.read()    --就Lua习惯而言,数组通常以1作为索引的起始值
end
在Lua5.1中,长度操作符"#"用于返回一个数组或线性表的最后一个索引值(或为其大小)。例如,可以像下面这样打印上例中读取到的每行内容:
--打印所有的行
for i = 1,#a do
print(a[i])
end


function(函数)
在Lua中,函数是作为"第一类值"来看待的。这表示函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值。Lua既可以调用以自身Lua语言编写的函数,又可以调用以c语言编写的函数。Lua所有的标准库都是用c语言写的,标准库中包括对字符串的操作、table的操作、I/O、操作系统的功能调用、数学函数和调试函数。同样,应用程序也可以用c语言来定义其他函数。


userdata(自定义类型)和thread(线程)
由于userdata类型可以将任意的c语言数据存储到Lua变量中。在Lua中,这种类型没有太多的预定义操作,只能进行赋值和相等性测试。userdata用于表示一种由应用程序或c语言库所创建的新类型,例如标准的I/O库就用userdata来表示文件。

0 0
原创粉丝点击