公司的流程真是很长,弄了一上午流程审批,还没有通过,只能重头开始再来一遍流程审批。过期的制度就是这样,公司规模大的话,流程制度是必要的。有人说,中国的国企或者政府,制度是一流的,但是执行力却要大打折扣。这也是过期亟需改革的一个大的方面吧。
lua学习,看了一下迭代器和错误处理。
迭代器,for的泛型语义
for语句中,使用迭代器时,首先会有三种状态,分别是迭代器函数,恒定值和控制变量,先初始化这三个状态,然后通过恒定值和控制变量的初始值调用迭代器函数,如果第一个返回值不是 nil,那么将执行for的循环体,比如
<code>
for var1,var2,...varn in <expr>
do
statment
end
</code>
可以用下面的语句描述:
<code>
local _f, _s, _var = <expr> -- 分别是迭代器函数,恒定值和控制变量
while true do
local _var1, _var2, ... = _f(_s, _var)
_var = _var1
if _var == nil then
break;
end
statment
end
</code>
错误处理函数
assert(v, [, message])
返回出错信息如果 v 是 false或者 nil,message 是出错信息;否则,返回所有参数,如果 v 是一个函数调用,就是返回函数的所有返回结果
error(message, [, level])
return message as error message,level 表示的级别,意思就是如果是调用者的错误,比如调用者参数出现明显错误,那么将 level 设置为2,表示不是函数内部出现的问题,是调用者出现的问题
pcall(f, [, arg1, ...])
call function g with given arguments. An error inside f is not propagated, instead, pcall catches the error and returns a status code
status code 为真,表示没有错误,返回status code + 函数f的所有返回值
status code 为假,说明f 执行出错,返回status code + 错误信息
协同程序 coroutine
lua 中的协同程序的函数都放在一个 coroutine 的表中,协同程序有四种状态
挂起 suspend, coroutine.yield()
运行 running
死亡 dead,运行结束
正常 normal,当A唤醒B时,B为 running 状态,而A此时就是normal状态
coroutine.yield() 协同程序进入挂起装填
coroutine.resume 协同程序唤醒挂起的协同程序或者第一次运行
协同程序不同于线程,具有多个线程的程序同时能运行多个线程,但是具有多个协同程序的程序任意时刻都只能运行一个协同程序,并且正在执行的协同程序只有显示的调用 coroutine.yield() 挂起时,才能停止(也就是说,只能自己挂起自己),而协同程序之间是互相协作的运行,这一点非常重要,不像线程之间是相互独立的。