์์ฑ๊ธฐ ํจ์๋ฅผ ์์ฑํ๋ ค๋ฉด yield(value)๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ yield()์ฒ๋ผ ์๋ํ์ง๋ง 'value'๋ ๋ค์ ์ ๋ฌ๋์ด resume() ํธ์ถ์์ ๋ฐํ๋ฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ ์ฌ์ ์ผ๋ก ๊ฑฐ๋ํ ๋ฐฐ์ด์ ๋ง๋๋ ๋์ range()๋ฅผ ๋ฐ๋ณต์๋ก ๋ง๋ค ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ํ ๋ชฉ๋ก/๋์ ๋๋ฆฌ ์ดํด์ ๊ฐ์ ๋ฉ์ง ๊ธฐ๋ฅ์ ํฅํ ํ ๊ฑธ์์ด ๋ ๊ฒ์ ๋๋ค.
๋ถ์พํ ํด๊ฒฐ ๋ฐฉ๋ฒ:
func xrange(count, dict):
var i = 0
while i < count:
dict.next = i
yield()
i += 1
func do_stuff():
var curr = {}
var it = xrange(5, curr)
while curr.value != null:
print(curr.value)
it.resume()
์ ๋ Godot์ ํจ๊ป ์ผํ๊ธฐ ์์ํ์ง๋ง(์ง๊ธ๊น์ง๋ ๋ง์์ ๋ค์์ต๋๋ค) yield()๊ฐ ํจ์ ์ํ๋ณด๋ค ๋ ๋ง์ ๊ฒ์ ๋ฐํํ ์ ์์ด์ผ ํ๋ค๊ณ ๋๋๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. yield๋ resume() ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋ฐํํ๋ ๊ฒ๊ณผ ๊ฐ์ผ๋ฏ๋ก ํจ์๋ ํญ๋ณตํ์ฌ ๊ฐ์ "๋ฐํ"ํ ์ ์์ด์ผ ํฉ๋๋ค.
๋ด๊ฐ ์๊ฐํ ํ ๊ฐ์ง ๊ฐ๋ฅํ ์ ๊ทผ ๋ฐฉ์์ [GDScript]FunctionState๋ฅผ ๋ณด๊ฐํ๋ ๊ฒ์
๋๋ค.
( https://docs.godotengine.org/en/3.1/classes/class_gdscriptfunctionstate.html )
yield()์ ๋ํ ์ธ์๋ฅผ ๋ฐํํ๋ ๋ฉ์๋ value()๋ฅผ ๊ฐ์ต๋๋ค.
func co1():
yield(5)
s = co1()
print(s.value()) # prints 5
GDscript์๋ ์ด๋ฏธ ๋ ๊ฐ์ ๊ฐ์ ์ทจํ๊ณ ์ ํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ yield๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ํ๋์ ์ธ์ ๋ฒ์ ์ FunctionState์์ ํด๋น ์ธ์๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ ๋ณ๊ฒฝ๋ง์ผ๋ก ์์ฑ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
func xrange(count):
var i = 0
while i < count:
yield(i)
func do_stuff():
var it = xrange(5)
while it:
print(it.result())
it = it.resume()
์ด๊ฒ์ ๊ฝค ์ ์๋ํ์ง๋ง ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์๋ ๋ฏธ๋ฌํจ์ด ์์ต๋๋ค. ์ฝ๋ฃจํด ํจ์๊ฐ (์๋ณดํ๋ ๋์ ) ๋ฐํ๋๋ฉด FunctionState๊ฐ ์๋ ๊ฐ์ด ๋ฐํ๋ฉ๋๋ค. ์์ ์์ ์์ null์ด ๋ฐํ๋์์ต๋๋ค(ํจ์๊ฐ void์ด๊ธฐ ๋๋ฌธ์). do_stuff()์์ ๋ฃจํ๋ฅผ ์ค์งํ๊ธฐ ์ํด ํ
์คํธํฉ๋๋ค. ์ฝ๋ฃจํด ํจ์๊ฐ ๊ฐ์ ๋ฐํํ๋ ๊ฒฝ์ฐ [์. xrange()] ๋์ return false
๊ฐ ์๋ค๊ณ ์์ํ๋ฉด ํด๋น ํ
์คํธ๊ฐ ์ค๋จ๋ฉ๋๋ค.
์ฝ๋๋ฅผ ์ดํด๋ด์ผ ํ ๊ฒ ๊ฐ์์.
IMO, yield(value)๋ ์, ๊ฐ์น๊ฐ ์์ ๊ฒ์
๋๋ค.
ํธ์ง: ์ฝ๋๋ฅผ ๋ณด๋ฉด yield์ ์ ํธ ๋ฒ์ ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ์ด์ ๋ํด ์๋์ ์์ฑํ ์น์ ์ ์ง๊ธ ์ ๊ฑฐ๋ฉ๋๋ค. ๋์ค์ ์์ธํ ์ค๋ช ํ ์ ์์ต๋๋ค.
yield
์๋ ๋ฐฉ์์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ๋ณด๋ค ์ง๊ด์ ์ธ await
๋ก ๋์ฒด๋ฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ฐ์ ๊ธฐ๋ฅผ ๋ง๋ค ๊ฒ์ธ์ง ์ฌ๋ถ๋ ์์ง ํ์คํ์ง ์์ต๋๋ค.
์์ฑ๊ธฐ๋ฅผ ์ถ๊ฐํ๋ ์์ด๋์ด์ ์ฌ์ ํ ๊ด์ฌ์ด ์๋ค๋ฉด ์ฃผ์ด์ง ๋ฌธ์ ํ ํ๋ฆฟ ์ ๋ฐ๋ผ GIP ์ถ์ ๊ธฐ์์ ์ ์ ์์ ์ฌ์ญ์์ค (์ด๋ฏธ ์กด์ฌํ์ง ์๋์ง ํ์ธํ ํ). ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ๊ณ ์ ์์์ ์์ด๋์ด๋ฅผ ์์ฝํ ์ ์์ต๋๋ค. ๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ๋ Godot์ ํจ๊ป ์ผํ๊ธฐ ์์ํ์ง๋ง(์ง๊ธ๊น์ง๋ ๋ง์์ ๋ค์์ต๋๋ค) yield()๊ฐ ํจ์ ์ํ๋ณด๋ค ๋ ๋ง์ ๊ฒ์ ๋ฐํํ ์ ์์ด์ผ ํ๋ค๊ณ ๋๋๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. yield๋ resume() ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋ฐํํ๋ ๊ฒ๊ณผ ๊ฐ์ผ๋ฏ๋ก ํจ์๋ ํญ๋ณตํ์ฌ ๊ฐ์ "๋ฐํ"ํ ์ ์์ด์ผ ํฉ๋๋ค.
๋ด๊ฐ ์๊ฐํ ํ ๊ฐ์ง ๊ฐ๋ฅํ ์ ๊ทผ ๋ฐฉ์์ [GDScript]FunctionState๋ฅผ ๋ณด๊ฐํ๋ ๊ฒ์ ๋๋ค.
( https://docs.godotengine.org/en/3.1/classes/class_gdscriptfunctionstate.html )
yield()์ ๋ํ ์ธ์๋ฅผ ๋ฐํํ๋ ๋ฉ์๋ value()๋ฅผ ๊ฐ์ต๋๋ค.
GDscript์๋ ์ด๋ฏธ ๋ ๊ฐ์ ๊ฐ์ ์ทจํ๊ณ ์ ํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ yield๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ํ๋์ ์ธ์ ๋ฒ์ ์ FunctionState์์ ํด๋น ์ธ์๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ ๋ณ๊ฒฝ๋ง์ผ๋ก ์์ฑ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๊ฝค ์ ์๋ํ์ง๋ง ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์๋ ๋ฏธ๋ฌํจ์ด ์์ต๋๋ค. ์ฝ๋ฃจํด ํจ์๊ฐ (์๋ณดํ๋ ๋์ ) ๋ฐํ๋๋ฉด FunctionState๊ฐ ์๋ ๊ฐ์ด ๋ฐํ๋ฉ๋๋ค. ์์ ์์ ์์ null์ด ๋ฐํ๋์์ต๋๋ค(ํจ์๊ฐ void์ด๊ธฐ ๋๋ฌธ์). do_stuff()์์ ๋ฃจํ๋ฅผ ์ค์งํ๊ธฐ ์ํด ํ ์คํธํฉ๋๋ค. ์ฝ๋ฃจํด ํจ์๊ฐ ๊ฐ์ ๋ฐํํ๋ ๊ฒฝ์ฐ [์. xrange()] ๋์
return false
๊ฐ ์๋ค๊ณ ์์ํ๋ฉด ํด๋น ํ ์คํธ๊ฐ ์ค๋จ๋ฉ๋๋ค.์ฝ๋๋ฅผ ์ดํด๋ด์ผ ํ ๊ฒ ๊ฐ์์.
IMO, yield(value)๋ ์, ๊ฐ์น๊ฐ ์์ ๊ฒ์ ๋๋ค.
ํธ์ง: ์ฝ๋๋ฅผ ๋ณด๋ฉด yield์ ์ ํธ ๋ฒ์ ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ์ด์ ๋ํด ์๋์ ์์ฑํ ์น์ ์ ์ง๊ธ ์ ๊ฑฐ๋ฉ๋๋ค. ๋์ค์ ์์ธํ ์ค๋ช ํ ์ ์์ต๋๋ค.