Lua nie może magicznie podać oryginalnych argumentów nowych wartości. Mogą nie być już na stosie, w zależności od optymalizacji. Co więcej, nie ma żadnego wskazania, gdzie kod był, gdy się uległ, więc może nie być już w stanie zobaczyć tych argumentów. Na przykład, jeśli coroutine nazwie funkcję, ta nowa funkcja nie może zobaczyć argumentów przekazanych do starego.
coroutine.yield()
zwraca argumenty przekazane do wywołania resume
, które kontynuują coroutine, dzięki czemu strona wywołania yield może obsługiwać parametry zgodnie z oczekiwaniami. Pozwala to kodowi powracającemu na komunikowanie się z określonym kodem wykonującym plonowanie. yield()
przekazuje swoje argumenty jako wartości zwracane z resume
, a resume
przekazuje swoje argumenty jako wartości zwracane do yield
. To ustanawia ścieżkę komunikacji.
Nie można tego zrobić w żaden inny sposób. Z pewnością nie przez modyfikowanie argumentów, które mogą być niewidoczne z witryny yield
. Jest prosty, elegancki i ma sens.
Uważa się także za wyjątkowo niegrzecznego, gdy chodzi o wsłuchiwanie się w czyjeś wartości. Zwłaszcza funkcja już działająca. Pamiętaj: argumenty są po prostu zmiennymi lokalnymi wypełnionymi wartościami. Użytkownik nie powinien oczekiwać zmiany zawartości tych zmiennych, chyba że sam je zmieni. W końcu są to zmienne local
. Można je zmieniać tylko lokalnie; stąd nazwa.
Czuję, że to nie odpowiada na pytanie.OP dotyczył/C API/funkcji lua_resume() i lua_yield(), które mają inną semantykę niż standardowa biblioteka 'coroutine.resume()', itp. (Na przykład, lua_resume ma trzy argumenty - dwa z nich to lua_State ...) – BadZen
Myślę, że odpowiada na pytanie o cel przekazywania parametrów i daje przykład, który można łatwo wypróbować przy pomocy interpretera Lua. W rzeczywistości, OP powiedział tak samo w swoim komentarzu w odpowiedzi Nicola. Zawsze możesz podać własną odpowiedź, jeśli uważasz, że masz lepszą. –
Istnieje duża różnica między obiektem coroutine w bibliotekach (które na przykład enkapsuluje lua_State) a używaniem API C. Nie mam lepszej odpowiedzi, więc otworzyłem kolejne pytanie z pytaniem o C API. Odpowiedź Nichola i twoje tutaj mówią o korupcyjnym obiekcie bibliotecznym. Istnieje około 100 linii kodu, które implementują to pod względem lua_ * API. Nie jest to oczywiste, a dokumentacja jest krótka. – BadZen