在Lua 5.1中,从不让协程正常结束有多糟糕?换句话说,如果一个协程收益但是我从来没有恢复它,它是否会在程序完成之前留下很多州?
cor=coroutine.wrap(somefunc)
while true do
done=cor()
if done then -- coroutine exited with "return true"
break
else -- coroutine yielded with "coroutine.yield(false)"
if some_condition then break end
end
end
function somefunc()
-- do something
coroutine.yield(false)
-- do some more
return true
end
Run Code Online (Sandbox Code Playgroud)
根据上面伪代码中的some_condition,协程可能永远不会被恢复,因此可能永远不会正确地"结束".
我可以这样做几十个协同程序而不必担心吗?将协同程序置于此状态是否安全?这个很贵吗?
我喜欢Lua,将它用作越来越多的项目作为主要(非嵌入式)语言.我目前的项目接近10,000行,可能会以约15,000行结束.在Lua中以这种规模进行开发时,您发现了什么有用的东西?你有什么打击你的头,你找到了什么解决方案?我正在考虑开发工具,语言功能和技术,第三方模块?
我的前三名:
strict.lua - 我使用了这个的修改版本.没有被提醒访问未使用/非预期的变量我会发疯.
协程 - 不是因为它们的多线程能力,而是因为它们的可持续性.对于简化状态机的实现非常有用.
序列化函数 - 对于转储表内容和将表持久化到磁盘是必不可少的(除非我可能已经到达数据库,否则我会多次使用它).
我的收藏:
OS X的可视调试器.我现在正在使用print(),但是让我单步执行源文件的调试器会很棒.
一个继续声明.使用重复...直到真正的解决方法是丑陋的,并且太多嵌套ifs变得复杂和丑陋.
修改现有表成员时调用的元方法.
大规模Lua开发的其他任何提示?
每当Lua脚本中发生错误时,除了通常的堆栈跟踪之外,我希望它将所有本地和全局变量的值写入屏幕/可选地写入文件.
我如何才能将此作为所有错误的默认行为?
有没有办法让函数知道它是否在协程中运行?
例如,我有一个send_message()函数,它尝试三次发送消息.在每次尝试之间需要等待一秒钟.如果从协程中调用此函数,我希望send_message()函数执行coroutine.yield()作为其wait-1秒循环的一部分.但如果它不在协程中,那么它应该做一个POSIX usleep().
有没有办法做到这一点?
当我在VIM中打开几个窗口时,每当我按下Ctrl-W_W时,我总是会跳过其中一个窗口(包含我的项目使用Aric Blumer的Project插件).
换句话说,我想在我的文档窗口中循环,好像Project窗口不是其中之一.当我确实想要进入项目窗口时,我将使用我为此专门创建的映射.
有没有办法标记一个窗口,以便它被Ctrl-W_W跳过或者我需要一个脚本?我喜欢Vim,但仍处于学习曲线的陡峭部分.