Lua kann den ursprünglichen Argumenten nicht magisch neue Werte geben. Sie sind möglicherweise nicht mehr auf dem Stapel, abhängig von den Optimierungen. Außerdem gibt es keinen Hinweis darauf, wo der Code war, als er nachgab, sodass er diese Argumente möglicherweise nicht mehr sehen kann. Wenn zum Beispiel die Coroutine eine Funktion aufgerufen hat, kann diese neue Funktion die Argumente, die in die alte übergeben wurden, nicht sehen.
coroutine.yield()
gibt die an den Aufruf resume
übergebenen Argumente zurück, die die Coroutine fortsetzen, sodass die Site des Yield-Aufrufs Parameter so verarbeiten kann, wie sie es wünschen. Es ermöglicht dem Code, der die Wiederaufnahme durchführt, mit dem spezifischen Code zu kommunizieren, der das Nachgeben bewirkt. yield()
übergibt seine Argumente als Rückgabewerte von resume
, und resume
übergibt seine Argumente als Rückgabewerte an yield
. Dies schafft einen Kommunikationsweg.
Sie können das nicht anders machen. Sicherlich nicht, indem Sie Argumente ändern, die möglicherweise von der yield
-Site aus nicht sichtbar sind. Es ist einfach, elegant und macht Sinn.
Außerdem wird es als äußerst unhöflich angesehen, auf jemandes Werte zu stoßen. Vor allem eine Funktion bereits in Betrieb. Denken Sie daran: Argumente sind nur lokale Variablen, die mit Werten gefüllt sind. Der Benutzer sollte nicht erwarten, dass sich der Inhalt dieser Variablen ändert, wenn er sie nicht selbst ändert. Sie sind schließlich local
Variablen. Sie können nur lokal geändert werden; daher der Name.
Ich glaube, das beantwortet die Frage nicht.Im OP ging es um die/C-API/Funktionen lua_resume() und lua_yield(), die eine andere Semantik als die Standardbibliothek 'coroutine.resume()' usw. haben. Zum Beispiel benötigt lua_resume drei Argumente - zwei davon sind lua_State ...) – BadZen
Ich denke, es beantwortet die Frage nach dem Zweck, Parameter zu übergeben und bietet ein Beispiel, das leicht zu versuchen ist, einen Lua-Interpreter zu haben. In der Tat, sagte OP in seinem Kommentar unter Nicols Antwort. Sie können immer Ihre eigene Antwort geben, wenn Sie denken, Sie haben eine bessere Antwort. –
Es gibt einen großen Unterschied zwischen dem Coroutinobjekt in libs (das zum Beispiel einen lua_State einkapselt) und der C-API. Ich habe keine bessere Antwort, also habe ich eine andere Frage gestellt, die speziell nach der C-API fragt. Nichols Antwort und Ihre hier sprechen beide von dem Koroutinenbibliotheksobjekt. Es gibt etwa 100 Codezeilen, die das in Bezug auf die lua_ * API implementieren. Es ist nicht offensichtlich, und die Dokumentation enthält wenig Details. – BadZen