ルアは魔法のようにオリジナルの引数に新しい値を与えることはできません。それらは、最適化に応じて、もはやスタックにないかもしれません。さらに、コードが生成されたときにそのコードがどこにあったかが示されていないため、それらの引数をもう見ることができなくなる可能性があります。たとえば、コルーチンが関数を呼び出した場合、その新しい関数は古い関数に渡された引数を見ることができません。
coroutine.yield()
は、コルーチンを継続するresume
コールに渡された引数を返します。これにより、yieldコールのサイトで必要なパラメータを処理できるようになります。それは、再開を行うコードが、特定のコードと通信して降伏することを可能にする。 yield()
はその引数をresume
の戻り値として渡し、resume
はその引数を戻り値としてyield
に渡します。これはコミュニケーションの経路を設定します。
他の方法ではできません。確かに、yield
サイトから見えないかもしれない引数を変更することではありません。シンプルでエレガントで、理にかなっています。
また、誰かの価値観を突き止めるのは非常に失礼だと考えられています。特に動作中の機能。覚えておいてください:引数は値で満たされたローカル変数です。ユーザーは、変数自体が変更されない限り、変数の内容が変更されることを期待しないでください。結局のところ、変数はlocal
です。それらはローカルでしか変更できません。したがって、名前。
私はこれが質問に答えないように感じる。OPは、標準ライブラリ 'coroutine.resume()'とは異なるセマンティクスを持つ/ C API /関数lua_resume()とlua_yield()に関するものでした(例えば、lua_resumeは3つの引数をとります.2つはlua_State ...) – BadZen
私はそれがパラメータを渡す目的についての質問に答えると思うし、Luaインタプリタを持ってみるのは簡単な例です。実際、OPはニコルの答えの下で彼のコメントで多くを言った。 あなたが良いと思ったら、いつでも自分の答えを出すことができます。 –
libsのcoroutineオブジェクト(例えば、lua_Stateをカプセル化する)とC APIを使用する場合には大きな違いがあります。私はより良い答えがないので、C APIについて具体的に質問する別の質問を開きました。 Nicholの答えとここでは、どちらもcoroutineライブラリオブジェクトについて説明しています。 lua_ * APIに関してこれを実装するコードは約100行あります。それは明白ではなく、ドキュメンテーションの詳細は不明です。 – BadZen