A 코루틴 은 동일한 스크립트 내에서 여러 태스크를 동시에 수행하기 위해 사용됩니다.이러한 작업에는 입력에서 값을 생성하거나 큰 문제를 해결할 때 하위 루틴에서 작업을 수행하는 것이 포함될 수 있습니다.태스크에는 정의된 종료 지점이 필요하지 않지만, 다른 사람들이 작업을 수행할 수 있도록 특정 시간을 정의해야 합니다( 중지 ).
코루틴 사용
새로운 코루틴은 coroutine.create()에 함수를 제공하여 생성할 수 있습니다.생성되면 코루틴은 함수에 인수를 전달하는 첫 번째 호출인 coroutine.resume() 이 수행될 때까지 실행을 시작하지 않습니다.이 호출은 함수가 중단되거나 호출되면 coroutine.yield() 을 반환하고, 이 일이 발생하면 coroutine.resume() 는 함수에서 반환된 값, coroutine.yield() 에 전송된 값 또는 오류 메시지를 반환합니다.오류가 발생하면 두 번째 반환 값은 발생한 오류입니다.
local function task(...)
-- 이 함수는 약간의 작업을 수행한 다음 일부 값을 반환할 수 있습니다
coroutine.yield("first") -- coroutine.resume()에 의해 반환될 예정
-- 함수는 다시 시작되면 계속됩니다
return "second"
end
local taskCoro = coroutine.create(task)
-- 처음부터 함수를 실행하는 첫 번째 시간 중단 호출
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> true, 먼저(코루틴.yield()라는 작업 호출)
-- 계속 실행하여 결과를 반환하거나 중지할 때까지 함수 실행 계속
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
코루틴의 수명 동안 상태를 확인하려면 coroutine.status()를 호출할 수 있습니다:
<th>의미</th></tr></thead><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)-- 코루틴을 호출한 것처럼 코루틴을 재시작합니다.resume()local result = f()-- 오류가 발생하면 여기에서 발생합니다!-- This differs from coroutine.resume() which acts similar to pcall()
coroutine.resume()에서 반환된 첫 번째 값은 코루틴이 오류 없이 실행되었는지 여부를 설명합니다.그러나, coroutine.wrap()에서 반환된 함수는 이렇게 하지 않습니다: 대신 반환되거나 전달된 값을 직접 coroutine.yield()에 반환합니다, 있는 경우.코루틴 함수를 실행하는 동안 오류가 발생하면 반환된 함수의 호출에서 오류가 발생합니다.
프로듀서 패턴 예시
단어의 반복을 생성하는 작업을 상상해 보십시오: 반복을 생성할 때마다 다음 작업은 하나 더 생성합니다.예를 들어, Hello 를 제공하면 Hello , HelloHello , HelloHelloHello 등이 생성됩니다.이를 수행하려면 repeatThis()를 정의할 수 있습니다.
-- 이 함수는 코루틴이 재개될 때마다 단어를 반복합니다
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")) -- true, 헬로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
요약
함수
제공된 코루틴을 닫고 사망 상태로 넣습니다.
신체 f가 Luau 함수여야 하는 새로운 코루틴을 생성합니다. Creates a new coroutine, with body f. f must be a Luau function.
이 함수의 코루틴이 안전하게 생성될 수 있는 경우 true 를 반환합니다.
코루틴의 실행을 시작하거나 계속합니다 co .
실행 중인 코루틴을 반환합니다.
코루틴 코의 상태를 문자열로 반환합니다.
새로운 코루틴을 만들고 호출되면 코루틴을 재개하는 함수를 반환합니다.
코루틴의 실행 중단.
함수
resume
코루틴의 실행을 시작하거나 계속합니다 co .코루틴을 재시작할 때 처음, 그 신체실행하기 시작합니다.값 ... 은 바디 함수에 인수로 전달됩니다.코루틴이 양도되었으면 재시작을 재개하십시오; 값 ... 은 양도의 결과로 전달됩니다.코루틴에 오류가 없이 실행되면 중단 후 반환은 참 plus 전달된 모든 값(코루틴이 생산되는 경우) 또는 바디 함수에서 반환된 모든 값(코루틴이 종료되는 경우)을 반환합니다.오류가 있으면 중단 후 오류 메시지와 함께 다시 반환됩니다.