为了回避这类问题,碰到 API 调用中调用让出时,除了那些抛出错误的 API 外,还提供了三个函数:,lua_callk
,和 。它们在让出发生时,可以从传入的 延续函数(名为 k
的参数)继续运行。
我们需要预设一些术语来解释延续点。对于从 Lua 中调用的 C 函数,我们称之为 原函数。从这个原函数中调用的上面所述的三个 C API 函数我们称之为 被调函数。被调函数可以使当前线程让出。(让出发生在被调函数是 lua_yieldk
,或传入 或lua_pcallk
的函数调用了让出时。)
下面的函数会做一个说明:
现在我们想允许被运行的 Lua 代码让出。首先,我们把函数改写成这个样子:
注意这里那个额外的显式的对延续函数的调用:Lua 仅在需要时,这可能是由错误导致的也可能是发生了让出而需要继续运行,才会调用延续函数。如果没有发生过任何让出,调用的函数正常返回,那么 lua_pcallk
(以及 )也会正常返回。(当然,这个例子中你也可以不在之后调用延续函数,而是在原函数的调用后直接写上需要做的工作。)
除了 Lua 状态,延续函数还有两个参数:一个是调用最后的状态码,另一个一开始由lua_pcallk
传入的上下文()。(Lua 本身不使用这个值;它仅仅从原函数转发这个值给延续函数。)对于 而言,状态码和 lua_pcallk
本应返回值相同,区别仅在于发生过让出后才执行完时,状态码为(而不是LUA_OK
)。对于 和lua_callk
而言,调用延续函数传入的状态码一定是。(对这两个函数,Lua 不会因任何错误而调用延续函数。因为它们并不处理错误。)同样,当你使用 lua_callk
时,你应该用 作为状态码来调用延续函数。(对于 lua_yieldk
,几乎没有什么地方需要直接调用延续函数,因为 本身并不会返回。)