coroutine.yield()로 일시 중단하기
Coddy Lua 여정의 Logic & Flow 섹션에 포함된 레슨 — 54개 중 50번째.
코루틴의 진정한 강력함은 coroutine.yield() 함수에서 나옵니다. 이것은 코루틴이 실행 중간에 스스로를 일시 중단하고 자신을 재개한 코드로 제어권을 다시 넘겨줄 수 있게 해줍니다.
코루틴이 coroutine.yield()를 호출하면, 그 즉시 해당 지점에서 실행을 멈춥니다. 해당 코루틴에 대해 다시 coroutine.resume()을 호출하면, 마치 아무 일도 없었던 것처럼 yield() 호출 바로 다음 지점부터 계속 실행됩니다.
간단한 예제입니다:
function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- "One"을 출력하고 일시 중단합니다
coroutine.resume(co) -- "Two"를 출력하고 일시 중단합니다
coroutine.resume(co) -- "Three"를 출력하고 종료합니다각 resume() 호출이 yield()를 만날 때까지 코루틴을 실행하는 방식에 주목하세요. 코루틴은 모든 지역 변수와 실행 상태를 포함하여 중단된 지점을 정확히 기억합니다.
yield할 때 값을 다시 전달할 수도 있습니다. coroutine.yield()에 전달하는 모든 인수는 coroutine.resume()의 반환 값이 됩니다:
function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value) -- 출력: 10
status, value = coroutine.resume(co)
print(value) -- 출력: 20챌린지
쉬움count를 인자로 받아 여러 번 값을 양보(yield)하는 코루틴의 출력을 문자열로 반환하는 createYieldingCoroutine 함수를 작성하세요.
1부터 count까지 각 단계에 대해 "Step X" 문자열을 양보하고, 완료되면 "Done"을 출력하는 코루틴을 생성하세요. 모든 양보된 값과 최종 완료를 얻기 위해 코루틴을 count + 1번 재개(resume)하세요. 양보된 모든 값을 줄바꿈 문자로 연결하여 반환하세요.
로직:
- 루프를 사용하여
"Step 1","Step 2"부터count까지 양보하는 함수를 만듭니다. - 모든 양보가 끝난 후 함수가 완료되어야 합니다 ( "Done"에 대한 최종 양보는 없음).
coroutine.create()를 사용하여 이 함수를 코루틴으로 감쌉니다.- 코루틴을
count번 재개하여 각 양보된 값을 수집합니다. - 양보된 모든 값을 줄바꿈 문자로 연결합니다.
- 연결된 문자열을 반환합니다.
매개변수:
count(number): 양보할 단계의 수
반환값: 줄바꿈으로 구분된 모든 양보된 값을 포함하는 문자열 (string). 형식: Step 1\nStep 2\nStep 3
치트 시트
coroutine.yield() 함수는 코루틴이 실행을 일시 중단하고 호출자에게 제어권을 반환할 수 있게 합니다. coroutine.resume()이 다시 호출되면, 코루틴은 yield() 호출 직후부터 실행을 재개합니다.
coroutine.yield()의 기본 사용법:
function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- "One"을 출력하고 일시 중단
coroutine.resume(co) -- "Two"를 출력하고 일시 중단
coroutine.resume(co) -- "Three"를 출력하고 종료coroutine.yield()를 사용하여 값 전달하기:
function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value) -- 출력: 10
status, value = coroutine.resume(co)
print(value) -- 출력: 20coroutine.yield()에 전달된 인수는 coroutine.resume()의 반환 값이 됩니다. 코루틴은 yield 사이의 모든 지역 변수와 실행 상태를 유지합니다.
직접 해보기
function createYieldingCoroutine(count)
-- 여기에 코드를 작성하세요
end
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.