lua 如何创建一个协城
时间: 2024-01-14 07:03:13 浏览: 23
Lua 语言中可以使用 `coroutine.create()` 函数来创建一个协程。该函数接受一个函数作为参数,并返回一个代表协程的对象(coroutine object)。
例如,以下代码创建了一个简单的协程:
```lua
function myCoroutine()
print("Coroutine started")
coroutine.yield()
print("Coroutine resumed")
end
myThread = coroutine.create(myCoroutine)
```
在上面的代码中,`myCoroutine()` 函数定义了协程的执行逻辑。首先输出一行文本,然后调用 `coroutine.yield()` 暂停协程的执行,等待后续的恢复。最后再输出一行文本。
通过 `coroutine.create()` 函数,我们将 `myCoroutine()` 函数封装成一个协程对象 `myThread`。此时协程对象并没有被执行,需要通过 `coroutine.resume()` 函数来启动它。
```lua
coroutine.resume(myThread)
```
上面的代码将启动协程对象 `myThread`,它会输出一行文本并暂停。需要注意的是,启动协程的时候不能将参数传给它,因为协程会从上次暂停的位置开始执行,而不是从头开始执行。
如果需要在协程中检查某个条件是否满足,可以在协程中使用 `coroutine.yield()` 暂停协程的执行,并将控制权交还给调用者。调用者可以在协程恢复执行前,对协程的状态进行修改。例如:
```lua
function myCoroutine()
local i = 0
while i < 3 do
print("Coroutine", i)
i = i + 1
coroutine.yield()
end
end
myThread = coroutine.create(myCoroutine)
coroutine.resume(myThread)
-- 输出 "Coroutine 0"
coroutine.resume(myThread)
-- 输出 "Coroutine 1"
coroutine.resume(myThread)
-- 输出 "Coroutine 2"
coroutine.resume(myThread)
-- 协程已经执行完毕,resume() 返回 false
```
在上面的例子中,协程 `myCoroutine()` 使用一个循环输出三行文本,并在每次循环结束后暂停协程的执行。在调用 `coroutine.resume()` 启动协程后,每次调用 `coroutine.resume()` 都会使协程继续执行一次循环,直到循环结束为止。在最后一次调用 `coroutine.resume()` 时,协程已经执行完毕,因此 `resume()` 返回 false。