Godot: рдЙрдкрдЬ рд╕реЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд▓рд╛рдЧреВ рдХрд░реЗрдВ ()

рдХреЛ рдирд┐рд░реНрдорд┐рдд 19 рдлрд╝рд░ре░ 2015  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: godotengine/godot

рдЬрдирд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдЬ (рдореВрд▓реНрдп) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдЙрдкрдЬ () рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди 'рдорд╛рди' рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ() рдХреЙрд▓ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд╛рд▓ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд░реЗрдВрдЬ() рдХреЛ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдореЗрдВ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдпрд╣ рд╕реВрдЪреА/рддрд╛рдирд╛рд╢рд╛рд╣реА рд╕рдордЭ рдЬреИрд╕реА рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдУрд░ рднреА рдПрдХ рдХрджрдо рд╣реЛрдЧрд╛ред

archived feature proposal gdscript

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВрдиреЗ рдЕрднреА рдЧреЛрдбреЛрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ (рдЕрдм рддрдХ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ) рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдЬ() рдлрд╝рдВрдХреНрд╢рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреАрд▓реНрдб рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд▓реМрдЯрдиреЗ рдЬреИрд╕рд╛ рд╣реИ () рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдЬ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдореВрд▓реНрдп "рд╡рд╛рдкрд╕реА" рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рд╡рд╣ рд╣реИ [GDScript]FunctionState . рдХреЛ рдмрдврд╝рд╛рдирд╛
( https://docs.godotengine.org/en/3.1/classes/class_gdscriptfunctionstate.html )
рдПрдХ рд╡рд┐рдзрд┐ рдорд╛рди () рд╣реИ рдЬреЛ рдЙрдкрдЬ () рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджреЗрддрд╛ рд╣реИред

func co1():
     yield(5)

s = co1()
print(s.value())   # prints 5

GDscript рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдпреАрд▓реНрдб рд╣реИ рдЬреЛ рджреЛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рддрд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг рдлрдВрдХреНрд╢рдирд╕реНрдЯреЗрдЯ рдореЗрдВ рдЕрдкрдирд╛ рддрд░реНрдХ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред рдмрд╕ рдЙрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

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()

рдпрд╣ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдПрдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИред рдЬрдм рдХреЛрд░рдЖрдЙрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ (рдЙрдкрдЬ рджреЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп) рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рди рдХрд┐ рдлрдВрдХреНрд╢рдирд╕реНрдЯреЗрдЯред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд▓ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╢реВрдиреНрдп рд╣реИ) рдЬрд┐рд╕реЗ рд╣рдо do_stuff() рдореЗрдВ рд▓реВрдк рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрд░рдЖрдЙрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ [рдЬреИрд╕реЗред xrange ()] рдХреЗ рдЕрдВрдд рдореЗрдВ return false рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рддреЛ рд╡рд╣ рдкрд░реАрдХреНрд╖рдг рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдЧрд╛ред
рдЖрдИрдПрдордУ, рдЙрдкрдЬ (рдореВрд▓реНрдп) рд╣реЛрдЧрд╛, рдПрд░реНрдо, рдореВрд▓реНрдпрд╡рд╛рдиред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЙрдкрдЬ рдХреЗ рд╕рд┐рдЧреНрдирд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓рддрд╛рдПрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЬрд┐рд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдореИрдВрдиреЗ рдиреАрдЪреЗ рд▓рд┐рдЦрд╛ рдерд╛ рд╡рд╣ рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЕрдкреНрд░рд┐рдп рдЙрдкрд╛рдп:

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()

рдореИрдВрдиреЗ рдЕрднреА рдЧреЛрдбреЛрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ (рдЕрдм рддрдХ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ) рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдЬ() рдлрд╝рдВрдХреНрд╢рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреАрд▓реНрдб рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд▓реМрдЯрдиреЗ рдЬреИрд╕рд╛ рд╣реИ () рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдЬ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдореВрд▓реНрдп "рд╡рд╛рдкрд╕реА" рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рд╡рд╣ рд╣реИ [GDScript]FunctionState . рдХреЛ рдмрдврд╝рд╛рдирд╛
( https://docs.godotengine.org/en/3.1/classes/class_gdscriptfunctionstate.html )
рдПрдХ рд╡рд┐рдзрд┐ рдорд╛рди () рд╣реИ рдЬреЛ рдЙрдкрдЬ () рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджреЗрддрд╛ рд╣реИред

func co1():
     yield(5)

s = co1()
print(s.value())   # prints 5

GDscript рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдпреАрд▓реНрдб рд╣реИ рдЬреЛ рджреЛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рддрд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг рдлрдВрдХреНрд╢рдирд╕реНрдЯреЗрдЯ рдореЗрдВ рдЕрдкрдирд╛ рддрд░реНрдХ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред рдмрд╕ рдЙрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

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()

рдпрд╣ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдПрдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИред рдЬрдм рдХреЛрд░рдЖрдЙрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ (рдЙрдкрдЬ рджреЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп) рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рди рдХрд┐ рдлрдВрдХреНрд╢рдирд╕реНрдЯреЗрдЯред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд▓ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╢реВрдиреНрдп рд╣реИ) рдЬрд┐рд╕реЗ рд╣рдо do_stuff() рдореЗрдВ рд▓реВрдк рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрд░рдЖрдЙрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ [рдЬреИрд╕реЗред xrange ()] рдХреЗ рдЕрдВрдд рдореЗрдВ return false рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рддреЛ рд╡рд╣ рдкрд░реАрдХреНрд╖рдг рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдЧрд╛ред
рдЖрдИрдПрдордУ, рдЙрдкрдЬ (рдореВрд▓реНрдп) рд╣реЛрдЧрд╛, рдПрд░реНрдо, рдореВрд▓реНрдпрд╡рд╛рдиред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЙрдкрдЬ рдХреЗ рд╕рд┐рдЧреНрдирд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓рддрд╛рдПрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЬрд┐рд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдореИрдВрдиреЗ рдиреАрдЪреЗ рд▓рд┐рдЦрд╛ рдерд╛ рд╡рд╣ рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

yield рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ await рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХ рд╕реАрдзрд╛ рд╣реИред рдореБрдЭреЗ рдЕрднреА рддрдХ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬрдирд░реЗрдЯрд░ рдХрд░реЗрдВрдЧреЗ рдпрд╛ рдирд╣реАрдВред

рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЬрдирд░реЗрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рджрд┐рдП рдЧрдП рдЗрд╢реНрдпреВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдмрд╛рдж GIP рдЯреНрд░реИрдХрд░ рдкрд░ рдПрдХ рдирдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЦреЛрд▓реЗрдВ (рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ)ред рдЖрдк рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

timoschwarzer picture timoschwarzer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nunodonato picture nunodonato  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

SleepProgger picture SleepProgger  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Zylann picture Zylann  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ivanskodje picture ivanskodje  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ