Programming in Lua
Copyright ® 2005, Translation Team, www.luachina.net
Programming in Lua
Programming in Lua
作者:Roberto Ierusalimschy
翻译:www.luachina.net
Simple is beautiful
Copyright ® 2005, Translation Team, www.luachina.net
Programming in Lua
i
版权声明
《Programming in Lua》的翻译由www.luachina.net完成。本站已经征得作者Mr.
Roberto Ierusalimschy的同意,可以翻译他的著作并在本站发布,本书的版权归Mr. Roberto
Ierusalimschy 所有,有关版权请参考下面引自官方网站的声明,未经许可不得擅自转贴
或者以任何形式发布本书,否则后果自负。
Copyright © 2003-2004 Roberto Ierusalimschy. All rights reserved.
This online book is for personal use only. It cannot be copied
to other web sites or further distributed in any form.
Copyright ® 2005, Translation Team, www.luachina.net
Programming in Lua
i
译序
“袁承志知道若再谦逊,那就是瞧人不起,展开五行拳,发拳当胸打去。荣彩和旁
观三人本来都以为他武功有独到之秘,哪知使出来的竟是武林中最寻常不过的五行拳。
敌对三人登时意存轻视,温青脸上不自禁露出失望的神色。
“荣彩心中暗喜,双拳如风,连抢三下攻势,满拟自己的大力魔爪手江南独步,三
四招之间就可破去对方五行拳,那知袁承志轻描淡写的一一化解。再拆数招,荣彩暗暗
吃惊,原来对方所使虽是极寻常的拳术,但每一招均是含劲不吐,意在拳先,举手抬足
之间隐含极浑厚的内力。”
——金庸《碧血剑》
编程语言之于程序员,若武功招式之于习武之人,招式虽重要,但在于使用之人。
胜者之道,武功只行于表,高手用剑,片草只叶亦威力无穷。
当今武林,派别林立,语言繁杂,林林总总不计其数。主流文化的C/C++、Java、
C#、VB;偏安一隅的Fortran;动态语言中的Perl、Tcl、Ruby、Forth、Python,以及本
书介绍的Lua;……,等等等等。再加上世界上那些不知道躲在哪的旮旯的奇奇怪怪的
hacker捣鼓出来的异想天开的语言,要想将各类语言囊入怀中,不异于痴人说梦。不信
可欣赏一下BrainFuck语言1的Hello World程序,语言本身依如其名。-☺-
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[
-]>++++++++[<++++>-]<.#>+++++++++++[<+++++>-]<.>++++++++[<+
++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]+++++
+++++.
虽说语言的威力依使用者本身的修为高低而定,但不同语言本身的设计又有不同。
若让用 Java 写写操作系统内核、Perl 写写驱动程序、C/C++写写 web 应用,都无异于舍
近求远,好刀只用上了刀背。
Lua 本身是以简单优雅为本,着眼于处理那些 C 不擅长的任务。借助 C/C++为其扩
展,Lua 可闪现无穷魅力。Lua 本身完全遵循 ANSI C 而写成,只要有 C 编译器的地方,
Lua 便可发挥她的力量。Lua 不需要追求 Python 那样的大而全的库,太多的累赘,反而
会破坏她的优美。
语言的优美,来自于使用者自己的感悟。Lua 的优雅,也只有使用后才会明白。
扬起帆,让我们一同踏上 Lua 的学习之旅……
1 有趣的Brain Fuck语言。http://www.muppetlabs.com/~breadbox/bf/
Copyright ® 2005, Translation Team, www.luachina.net
Programming in Lua
ii
本书的翻译,是www.luachina.net中朋友们共同努力的结果。下面是参与翻译与校对
的朋友:
i = i + 1
then return t[i] end
"----参与翻译----",
"buxiu", "凤舞影天", "zhang3",
"morler", "lambda", "sunlight",
"\n",
local i = 0
local n = table.getn(t)
return function ()
if i <= n
end
-- file: 'thanks.lua'
-- desc: to print the list of the contributing guys
function list_iter (t)
end
helpful_guys = {
}
for e in list_iter(helpful_guys) do
end
"----参与校对----",
"凤舞影天", "doyle", "flicker",
"花生魔人", "zhang3", "Kasi",
"\n"
print(e)
www.luachina.net翻译组
2005 年 7 月 26 日
注:本 pdf 为翻译稿,校对工作在进行。
Copyright ® 2005, Translation Team, www.luachina.net
Programming in Lua
iii
目录
版权声明 ........................................................................................................................................ i
译序 ................................................................................................................................................ i
目录 .............................................................................................................................................. iii
第一篇 语言 ................................................................................................................................. 1
第 0 章 序言 ................................................................................................................................. 1
0.1 序言 .................................................................................................................................... 1
0.2 Lua的使用者....................................................................................................................... 2
0.3 Lua的相关资源................................................................................................................... 3
0.4 本书的体例 ........................................................................................................................ 3
0.5 关于本书 ............................................................................................................................ 3
0.6 感谢 .................................................................................................................................... 4
第 1 章 起点 ................................................................................................................................. 5
1.1 Chunks................................................................................................................................. 5
1.2 全局变量 ............................................................................................................................ 7
1.3 词法约定 ............................................................................................................................ 7
1.4 命令行方式 ........................................................................................................................ 7
第 2 章 类型和值 ......................................................................................................................... 9
2.1 Nil........................................................................................................................................ 9
2.2 Booleans .............................................................................................................................. 9
2.3 Numbers............................................................................................................................. 10
2.4 Strings................................................................................................................................ 10
2.5 Functions ........................................................................................................................... 12
2.6 Userdata and Threads ........................................................................................................ 12
第 3 章 表达式 ........................................................................................................................... 13
3.1 算术运算符 ...................................................................................................................... 13
3.2 关系运算符 ...................................................................................................................... 13
3.3 逻辑运算符 ...................................................................................................................... 13
3.4 连接运算符 ...................................................................................................................... 14
3.5 优先级 .............................................................................................................................. 15
3.6 表的构造 ........................................................................................................................... 15
第 4 章 基本语法 ....................................................................................................................... 18
4.1 赋值语句 .......................................................................................................................... 18
4.2 局部变量与代码块(block) ......................................................................................... 19
4.3 控制结构语句 .................................................................................................................. 20
Copyright ® 2005, Translation Team, www.luachina.net
Programming in Lua
iv
4.4 break和return语句............................................................................................................. 23
第 5 章 函数 ............................................................................................................................... 24
5.1 返回多个结果值 .............................................................................................................. 25
5.2 可变参数 ........................................................................................................................... 27
5.3 命名参数 .......................................................................................................................... 28
第 6 章 再论函数 ....................................................................................................................... 30
6.1 闭包 .................................................................................................................................. 32
6.2 非全局函数 ...................................................................................................................... 34
6.3 正确的尾调用(Proper Tail Calls) ............................................................................... 36
第 7 章 迭代器与泛型for........................................................................................................... 40
7.1 迭代器与闭包 .................................................................................................................. 40
7.2 范性for的语义.................................................................................................................. 42
7.3 无状态的迭代器 .............................................................................................................. 43
7.4 多状态的迭代器 .............................................................................................................. 44
7.5 真正的迭代器 .................................................................................................................. 45
第 8 章 编译·运行·调试 ....................................................................................................... 47
8.1 require函数........................................................................................................................ 49
8.2 C Packages......................................................................................................................... 50
8.3 错误 .................................................................................................................................. 51
8.4 异常和错误处理 .............................................................................................................. 52
8.5 错误信息和回跟踪(Tracebacks) ................................................................................ 53
第 9 章 协同程序 ....................................................................................................................... 56
9.1 协同的基础 ...................................................................................................................... 56
9.2 管道和过滤器 .................................................................................................................. 58
9.3 用作迭代器的协同 .......................................................................................................... 61
9.4 非抢占式多线程 .............................................................................................................. 63
第 10 章 完整示例 ..................................................................................................................... 68
10.1 Lua作为数据描述语言使用 ........................................................................................... 68
10.2 马尔可夫链算法 ............................................................................................................ 71
第二篇 tables与objects............................................................................................................... 75
第 11 章 数据结构 ..................................................................................................................... 76
11.1 数组 ................................................................................................................................ 76
11.2 阵和多维数组 ................................................................................................................ 77
11.3 链表 ................................................................................................................................ 78
11.4 队列和双端队列 ............................................................................................................ 78
11.5 集合和包 ........................................................................................................................ 80
11.6 字符串缓冲 .................................................................................................................... 80
第 12 章 数据文件与持久化 ..................................................................................................... 84
12.1 序列化 ............................................................................................................................ 86
Copyright ® 2005, Translation Team, www.luachina.net
Programming in Lua
v
第 13 章 Metatables and Metamethods ...................................................................................... 92
13.1 算术运算的Metamethods............................................................................................... 92
13.2 关系运算的Metamethods............................................................................................... 95
13.3 库定义的Metamethods................................................................................................... 96
13.4 表相关的Metamethods................................................................................................... 97
第 14 章 环境 ........................................................................................................................... 103
14.1 使用动态名字访问全局变量 ...................................................................................... 103
14.2 声明全局变量 ............................................................................................................... 104
14.3 非全局的环境 .............................................................................................................. 106
第 15 章 Packages .................................................................................................................... 109
15.1 基本方法 ...................................................................................................................... 109
15.2 私有成员(Privacy) ...................................................................................................111
15.3 包与文件 .......................................................................................................................112
15.4 使用全局表 ...................................................................................................................113
15.5 其他一些技巧(Other Facilities)...............................................................................115
第 16 章 面向对象程序设计 ....................................................................................................118
16.1 类 ...................................................................................................................................119
16.2 继承 .............................................................................................................................. 121
16.3 多重继承 ...................................................................................................................... 122
16.4 私有性(privacy) ...................................................................................................... 125
16.5 Single-Method的对象实现方法 ................................................................................... 127
第 17 章 Weak表 ...................................................................................................................... 128
17.1 记忆函数 ...................................................................................................................... 130
17.2 关联对象属性 .............................................................................................................. 131
17.3 重述带有默认值的表 .................................................................................................. 132
第三篇 标准库 ......................................................................................................................... 134
第 18 章 数学库 ....................................................................................................................... 135
第 19 章 Table库 ...................................................................................................................... 136
19.1 数组大小 ....................................................................................................................... 136
19.2 插入/删除 ..................................................................................................................... 137
19.3 排序 .............................................................................................................................. 137
第 20 章 String库 ..................................................................................................................... 140
20.1 模式匹配函数 .............................................................................................................. 141
20.2 模式 .............................................................................................................................. 143
20.3 捕获(Captures) ........................................................................................................ 146
20.4 转换的技巧(Tricks of the Trade)............................................................................ 151
第 21 章 IO库........................................................................................................................... 157
21.1 简单I/O模式................................................................................................................. 157
21.2 完全I/O 模式............................................................................................................... 160
Copyright ® 2005, Translation Team, www.luachina.net