CH1: 开始
- 程序块:Lua执行的每段代码,例如一个源代码文件或在交互模式输入一行代码,也就是一连串的语句或命令(理解这个概念很重要);
- 小技巧:dofile函数在测试代码时的用处;
- Lua的标识符:
- 可由任意字母、数字、下划线构成,不能以数字开头避免以一个下划线开头并跟着一个或多个大写字母。
- 避免以一个下划线开头并跟着一个或多个大写字母的标识符,lua将之保留作他用。
- 保留字符"_"(仅一个下划线)作为“亚变量”。
- 注释:
- --:注释单行
- --[[ --]], 多行,建议用这种,调试代码的时候方便,只需在前一个前面再加一"-"
- 解释器程序:
- 概念:解释器是一个小型的程序(根据其源代码文件,可称"lua.c“),可通过它直接使用Lua。
- 常用参数:
- lua -e "print("coding direct!")" ( 用于在命令行中直接输入代码)
- -l : 加载库文件
- -i : 表示在运行完其他命令行参数后进入交互模式
- 直接在解释器中输入"=",可打印任何表达式的值,有助于将Lua作计算器使用
CH2:类型与值
- lua的8种基本类型:nil, boolean, number, string, userdate, function(函数), thread(线程), table
- 函数是“第一类值(first-class value)“,可像操作其他值一样来操作函数!!
- number类型用于表示实数(具体见luaconf.h),lua中没有整数的必要.
- 有趣的技巧:用一对匹配的双方括号界定一个字母字符串,就像写”块注释“,例如:
-
page =[[
An HTML page lua ]] - Lua提供运行时数字与字符串数字自动转换:print("1" + 1) --> 2
- ".." :字符串连接操作符,左右要留空
- tonumber(), tostring()
- "#":在字符串前放置获取该字符串长度,也可获取数组的长度
- table是本章的关键也是lua的重点,具体研究,详见:《浅谈Lua中的table》
- userdata(自定义类型)可将任意的c语言数据存数到lua变量中,thread(线程)具体在“协同程序”中
CH3:表达式
- %(取模)小技巧:x%1取小数部分, x-x%0.01精确到小数点后两位
- 对于table、userdata、函数,lua是做引用比较的,这一点也是很重要的,具体研究,详见:《关于lua中table、userdata、函数的引用的理解》
- 两种习惯写法:
- x = x or v,如可用在没设置x的初值,将其设置为默认值v
- (a and b) or c 类似于c中的 a?b:c
- table构造式,也是重点,详见: 《浅谈Lua中的table》
CH4:语句
- Lua允许多重赋值,比较常见的应用:交换两个变量和手机函数的多个返回值
- 局部变量与块(对局部变量及其作用域的理解也是比较重要的):
- 语法:local
- 作用域:仅限于生命它们的那个块
- 交互模式中每行内容自身就形成了一个程序块(除非该航内容不足以构成一条完整的程序)
- do-end
- 一种习惯写法:local foo = foo,
- 含义:创建一个局部变量foo,并用全局变量foo初始化
- 好处:
- 后续程序改变foo,对全局的foo无影响
- 加速当前作用域对foo的访问(局部变来那个的访问效率总是要高于全局变量)
- 数字型for(numbereric for)
- 语法:”for var = exp1, exp2, exp3 do <执行体> end “ (exp3为步长,不写默认1)
- 泛型for(generic for)
- 标准库提供的迭代器:io.lnes, pairs, ipairs, string.gmatch等,具体研究,详见:《Lua中常用的迭代器》
CH5:函数
CH6:深入函数
这两个章节都是讲函数的,具体研究,详见:《Lua中的函数浅谈》
CH7:迭代器与泛型for 具体研究,详见:《Lua中的迭代器》
CH8:编译、执行与错误
- 何为解释型语言:主要特征并不在于是否能编译它们,而在于编译器是否是语言运行是库的一部分,即是否有能力执行动态生成的代码。dofile等函数的存在,充分说明了Lua是一种解释型语言
- dofile、loadstring
- Lua提供的所有关于动态链接的功能均聚集在一个函数,即package.loadlib, 两个参数如下
- 动态库的完整路径:local path = "/usr/local/lib/lua/5.1/socket.so"
- 一个函数名称:loaca f = package.loadlib(path, "luaopen_socket")
- require
- pcall
- error函数
- 用法:error("there is a error", 2); error("there is a error")
- 说明:error的第二个附加参数level(层),用于指出应由嗲用层级中的哪个(层)函数来报告当前错误
- xpcall