- 搭建环境,准备代码阅读和分析工具,所谓“工欲善其事必先利其器”也
准备 understand, enterprise architect,sourceInsight这三个基本工具。
-- sourceInsight 使代码阅读和编辑的利器,能够很方便的在函数申明,调用之间进行跳转,很方便对代码进行细读时使用
-- enterprise architect,简称EA,这款工具一般主要用于UML建模等,但这仅仅只是其中一个很小的功能,它能够根据源代码进行反向工程,反向出UML model,能够根据DB model 生成相应的DDL,也能够根据DDL反过来生成相应的DB model,合理的使用EA,能够大大简化工作量。一般我阅读代码的时候,主要使用的就是EA的反向工程的能力(reverse engineering)
-- understand 这款工具,也是最近才得知的,这个工具是一款代码分析工具,能够对源代码进行分析,同时生成各种模型图,方便对代码进行阅读和理解。
lua学习回顾与总结:
lua 函数是一种左值,也就是说,function 类型的数,比如 print 函数,其实是print 变量指向一个函数,能够像 字符串或者整型数一样使用,能够作为函数参数,能够作为函数返回值使用。一般定义函数如下所示:
<code>
local function sum()
statement
end
</code>
<code>
等价于
local sum
sum = function ()
statement
end
</code>将到 lua 中的函数,就不得不提到闭包的概念 clousure。闭包指的是值,而不是函数原型。所谓的闭包,就是一个函数及其该函数所需访问的所有“外部的局部变量”。外部的局部变量,也称为为"UpValue",这是有历史意义的。在lua 总,所有的函数都是闭包。
比如
<code>
function newCounter ()
local i = 0
return function ()
i = i + 1
return i
end
end
</code>
上面的函数中,newCounter 就是一个闭包,在该函数内部,返回了一个匿名函数,该匿名函数能够直接访问newCounter 内部的局部变量 i,这就是外部的局部变量迭代器
for 语句使用迭代器的时候,会保存三个值:迭代器函数、恒定状态和控制变量。
比如
for var1, var2,...varn in <exp-list> do
block
end
首先,迭代器函数 <exp-list>会返回三个值个for,迭代器函数_f, 恒定状态_s,控制变量_var。然后通过恒定状态和控制变量对迭代器函数求值,返回值中如果第一个值不是nil,那么将执行循环体中的语句,否则,退出循环。可以写成如下代码块:
<code>
_f,_s,_var = <exp-list>
while true do
var1,var2,...,varn = _f(_s, _var)
_var = var1
if _var == nil then
break
end
block
end
</code>
还有无状态的迭代器,lua提供的迭代器:
数组 -- ipairs()
table -- pairs()
string中的单词 -- string.gmatch()
行 -- io.lines()
dofile()
loadfile()
loadstring
require
错误处理
assert
pcall
xpcall
debug.debug()
debug.traceback()
- 协同程序
协同程序与多线程类似,但是一个程序能够同时运行多个线程,线程之间彼此相互独立,一个程序同时只能运行一个协程,协程之间是相互合作运行的。一个协程只有在其显示的要求挂起时,才会暂停执行。
coroutine.create() -- 创建协同程序
coroutine.yield() -- 挂起
coroutine.resume() -- 唤醒
resume - yield 之间可以相互传递参数,类似于生产者与消费者之间的关系