第一部分
书本下载地址 http://download.csdn.net/detail/myy2012/5349646
本部分代码下载 http://download.csdn.net/detail/myy2012/5344692
lua程序设计第二版 读书笔记(1-4章)
第一章 开始
第二章 类型与值
第三章 表达式
第四章 语句
http://blog.csdn.net/myy2012/article/details/8900424
lua程序设计第二版 读书笔记(5-8章)
第五章 函数
第六章 深入函数
第七章 迭代器与泛型for
第八章 编译执行与错误
http://blog.csdn.net/myy2012/article/details/8906466
lua程序设计第二版 读书笔记(9-10章)
第九章 协同程序
第十章 完整的实例
http://blog.csdn.net/myy2012/article/details/8911206
lua程序设计第二版 读书笔记(11-14章)
第十一章 数据结构
第十二章 数据文件与持久性
第十三章 元表metatable与元方法meatmethod
第十四章 环境
http://blog.csdn.net/myy2012/article/details/8914457
lua程序设计第二版 读书笔记(15-17章)
第十五章 模块与包
第十六章 面向对象编程
第十七章 弱引用 table
http://blog.csdn.net/myy2012/article/details/8921632
lua程序设计第二版 读书笔记(18-21章)
第十八章 数学库
第十九章 table库
第二十章 字符串库
第二十一章 IO库
http://blog.csdn.net/myy2012/article/details/8925895
lua程序设计第二版 读书笔记(22-23章)
第二十二章 操作系统库
第二十三章 调试库
http://blog.csdn.net/myy2012/article/details/8930181
第一章
1.1程序块(chunk)
Lua执行的每段代码,例如一个源代码文件或在交互模式输入的一行代码,被称为一个程序块。
在这种模式中,输入的每条命令(例如 print “Hello World”)都将立即被执行。要退出交互模式和解释器,只需要输入一个end-of-file控制字符(windows7 下ctrl+c),或者输入os.exit()
1.2词法规范
Lua中的标示符是由任意字母、数字和下划线构成的字符串,但不能以数字开头。
关键字
关键字是不能做为变量的。Lua的关键字不多,就以下几个:
and break do else elseif end false for function if
in local nil not or repeat return then true until while
注释
写一个程序,总是少不了注释的。
在Lua中,你可以使用单行注释和多行注释。
单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止。相当于C++语言中的"//"。
多行注释中,由"--[["表示注释开始,并且一直延续到"]]"为止。这种注释相当于C语言中的"/*...*/"。在注释当中,"[["和"]]"是可以嵌套的(在lua5.1中,中括号中间是可以加若干个"="号的,如 [==[ ... ]==]),见下面的字符串表示说明。
1.3全局变量
全局变量(Global Variable)不需要声明。只需要将一个值赋予一个全局变量就可以创建了。
在lua中,访问一个未初始化的变量不会引发错误,访问结果是一个特殊的值nil。
1.4解释器程序(the dtand-slone interpreter)
涉及unix系统。
第二章 类型与值
2.1 nil(空)
正如前面所说的,没有使用过的变量的值,都是nil。有时候我们也需要将一个变量清除,这时候,我们可以直接给变量赋以nil值。如:var1=nil
print(type(nil))------nil
2.2 boolean(布尔)
布尔值通常是用在进行条件判断的时候。布尔值有两种:true 和 false。在Lua中,只有false和nil才被计算为false,而所有任何其它类型的值,都是true。比如0,空串等等,都是true。
print(type(true))----boolean
2.3 number(数字)
在Lua中,是没有整数类型的,也不需要。一般情况下,只要数值不是很大(比如不超过100,000,000,000,000),是不会产生舍入误差的。
print(type(3.14))----number
2.4 string(字符串)
在Lua中,我们可以非常方便的定义很长很长的字符串。
字符串在Lua中有几种方法来表示,最通用的方法,是用双引号或单引号来括起一个字符串的,如:"Hello "或'Hello world!'
print(type(“boy”))----string
print(type(type(x)))----string
2.5 table(表)
table 类型实现了“关联数组(associative array)”。Table没有固定的大小,可以动态的添加任意数量的元素到一个table中。Table是Lua中仅有的数据结构机制。
在Lua中,你可以用任意类型来作数组的索引,除了nil。在Lua中,你也可以用任意类型的值来作数组的内容,除了nil。
table的定义很简单,它的主要特征是用"{"和"}"来括起一系列数据元素的。比如:
tbl = {} -- 定义一个空表
a={}
k=”x”
a[k]=10 --新条目 key为”x” value为10
a[20]=”great” --新条目 key为20 value为”great”
b=a --b和a引用了同一个table
print(a[“x”]) --10
print(b[20]) --great
a=nil --现在只有b还在引用table
b=nil --再也没有对table的引用了
Lua对于诸如a[“name”]的写法提供了一种更简便的“语法糖”,可以直接输入a.name。
如: a={}
x=”y”
a[x]=10
print(a[x])--10
print(a.x) --nil
print(a.y) -- 10
2.6函数(function)
函数,在Lua中,函数的定义也很简单。典型的定义如下:
function add(a,b) -- add 是函数名字,a和b是参数名字
return a+b -- return 用来返回函数的运行结果
end
2.7 userdata (自定义类型)和thread(线程)
Userdata类型可以将任意的c语言数据存储到Lua变量中。
在Lua中,这种类型没有太多的预定义操作,只能进行赋值和相等性测试。
第三章 表达式
3.1算术操作符
二元的:+ - * / ^ % 一元的:-
3.2关系操作符
< > <= >= ~= ==
关系运算符的结果为true或者false
3.3逻辑操作符
以false和nil为假,其他的为真
and:第一个参数为假则为假,否则返回第二个参数
or:第一个参数为真则为真,否则返回第二个参数
not:只返回true或者false
a and b or c 等价于 a? b:c --前提b不为假
如:x>y and x or y
3.4字符串连接
要在lua中连接两个字符串,可以使用操作符”..”(两个点)。
print( “Hello”..”World”) -- Hello World
print(0..1) --01
3.5优先级
和C语言一样,括号可以改变优先级。
3.6 table构造式(table constructor)
构造式是用于创建和初始化table的表达式。
如:days={“Sunday”, “Monday”, “Tuesday”, “Wednesday”,
“Thursday”, “Friday”, “Saturday”}
print(days[1]) --Sunday
print(days[4]) --Wednesday
对于某些情况真的需要以0作为一个数组的起始索引的话,也可以构造
Days={[0]=”Sunday”, “Monday”, “Tuesday”, “Wednesday”,
“Thursday”, “Friday”, “Saturday”}
Lua还提供了一种特殊的语法用于初始化记录风格的table
A={} a.x=10 a.y=20 等价于 a={x=10, y=20}
将记录风格的初始化与列表风格的初始化混合在一个构造式中使用:
Polyline={ color=”blue”, thickness=2, npoints=4,
{x=0, y=0},
{x=-10, y=0},
{x=-10, y=1},
{x=0, y=1}
}
print(polyline[2].x) -- -10
print(polyline[4].x) -- 0
第四章 语句
4.1赋值
赋值(assignment)的基本含义是修改一个变量或一个table中字段的值
Lua允许“多重赋值”,也就是同时将多个值赋予给多个变量。
规则:若左边个数多,则多出的变量为nil
若右边个数多,则多出的值被舍弃
a, b = 10, 20
x, y = y, x --交换 x 与y
a, b, c = 10
a, b = 10, 20, 30
4.2局部变量与块(block)
与全局变量不同的是,局部变量的作用域仅限于声明他们的那个块。
do-end 可以显示的指定块
do
x=10
local i=1
if i>20 then
local x
x=20
print(x) --20
else
print(x) --10
end
print(x) --10
end
“尽可能的使用局部变量”是一种良好的编程风格。所声明的局部变量被当做语句来处理,
因此可以在任何允许书写语句的地方书写局部变量的声明。缩小变量的作用域可以提高代码的阅读。
4.3控制结构
if then else end
if 语句先测试其条件,然后根据测试结果执行then部分,else部分是可选的。若要嵌套的if,可以使用elseif
local i=10
if i>0 then
print("i>0")
elseif i<0 then
print("i<0")
else
print("i==0")
end
while end
lua先测试while的条件,如果为假则循环结束,否则一直重复
local i=10
while i>10 do
print(i)
i=i-1
end
repeat until
一条repeat--until语句重复执行其循环体直到条件为真时结束。(循环体至少执行一次)
local i=10
repeat
print(i)
i=i+10
until i>50
数字型for (numeric for)
for do end
for和do之间有三个参数分别为:起始,终止(math.huge无上限),步长(默认为1)
for k=0, 3, 1 do
print("k="..k)
end
不要在循环过程中修改控制变量的值,否则会导致不可预测的后果。
如果想在for循环正常结束前终止循环,可以使用break跳出循环。
泛型for(generic for)
泛型for循环通过一个迭代器(iterator)函数来遍历所有值
a={"boy", "bad", "girl", "good"}
b={}
for key, value in ipairs(a) do
print(key, value)
b[value]=key --完成逆向table
end
4.4 break与return
break语句用于结束一个循环,它只会跳出包含它的那个内部循环(for repeat while)
Return语句用于从一个函数中返回结果,或者用于简单地结束一个函数的执行。