coroutine은 스크립트 내에서 여러 작업을 동시에 수행하는 데 사용됩니다. 이러한 작업은 입력에서 값을 생성하거나 더 큰 문제를 해결할 때 하위 루틴에서 작업을 수행하는 것과 같이 포함될 수 있습니다. 작업은 정의된 종료 지점이 필요하지
코루틴 사용
새로운 코루틴을 생성하려면 함수를 제공하여 coroutine.create() 에 시작하십시오. 한 번 생성된 코
local function task(...)
-- 이 함수는 일을 조금 하고 값을 생성합니다.
coroutine.yield("first") -- coroutine.resume()에 의해 반환됩니다.
-- 함수는 다시 시작할 때 계속됩니다.The function continues once it is resumed again
return "second"
end
local taskCoro = coroutine.create(task)
-- 함수를 처음부터 실행하는 즉시 호출을 시작하십시오.
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> true, first (작업명 coroutine.yield()}
-- 함수가 실행될 때까지 계속 실행하십시오.
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
코루틴의 수명 동안 coroutine.status()를 호출하여 상태를 검사할 수 있습니다.
<tbody><tr><td><b>서스펜드</b></td> <td>코루틴은 재시작될 준비가 되어 있습니다. 코루틴은 <code>coroutine.yield()</code> 함수를 호출할 때 시작됩니다.</td></tr><tr><td><b>실행 중입니다.</b></td><td>코루틴은 지금 실행 중입니다.</td></tr><tr><td><b>일반적인 것은 일반적인 것입니다.</b></td> <td>코루틴은 다른 코루틴의 생성을 기다리고 있습니다; 즉, 다른 코루틴을 다시 시작했습니다.</td></tr><tr><td><b>죽음을 맞았습니다.</b></td> <td>함수가 중지되었습니다(오류가 반환되거나 제거됨). 코루틴은 더 이상 사용할 수 없습니다.</td></tr></tbody>
상태 | 의미 |
---|
코룰린 감싼 코드
코루틴을 사용할 때 코루틴 개체의 사용을 포기할 수도 있습니다 대신 래퍼 함수를 사용할 수 있습니다. 이런 래퍼 함수는 특정 코루틴을 재사용하고 호출될 때만 반환하는 값을 반환합니다. 이를 수행하려면 coroutine.wrap()를 사용할 수 있습니다.
-- 코루틴을 생성하고 다시 호출하는 래퍼 함수를 반환합니다.local f = coroutine.wrap(task)-- coroutine.resume()을 호출한 것처럼 코루틴을 재시작하십시오.local result = f()-- 오류가 발생하면 여기에 표시됩니다!-- This differs from coroutine.resume() which acts similar to pcall()
Library.coroutine.resume()에서 반환된 첫 번째 값은 코루틴이 오류 없이 실행되는지 여부를 설명합니다. 그러나 coroutine.wrap()에서 반환된 함수는 이 작업을 수행하지 않습니다. 대신 반환된 값이 반환하거나 전달
생산자 패턴 예시
단어의 반복을 생성하는 작업을 상상하십시오: 각 번 반복을 생성할 때, 다음 번에 한 번만 더 생성됩니다. 예를 들어, Hello 을 제공하면 Hello , HelloHello, 2>HelloHello2> 등을 생성합니다. 이를 수행하
-- 이 함수는 코루틴이 재시작될 때마다 단어를 반복합니다.
local function repeatThis(word)
local repetition = ""
while true do
-- 반복을 하고 결과를 생성하세요
repetition = repetition .. word
coroutine.yield(repetition)
end
end
이 함수를 코루틴으로 실행하려면 coroutine.create() 다음에 여러 호출을 사용하여 coroutine.resume() :
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- 안녕print(coroutine.resume(repetitionCoro)) -- 안녕, HelloHelloprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
이 생산자 기능에는 coroutine.wrap() 를 사용하여 값을 생성하는 기능을 구현할 수도 있습니다.
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- 안녕print(f()) -- 안녕하세요print(f()) -- HelloHelloHello