6

lua_resume と lua_yield に引数を渡す目的は何ですか?

lua_resume の最初の呼び出しで、再開される lua 関数に引数が渡されることを理解しています。意味あり。ただし、その後の lua_resume のすべての呼び出しで、コルーチンの関数の引数が「更新」されることを期待しています。しかし、そうではありません。

lua_yield が返すために lua_resume に引数を渡す目的は何ですか? コルーチンの下で実行されている lua 関数は、lua_resume によって渡された引数にアクセスできますか?

4

3 に答える 3

10

ニコルが言ったこと。resume必要に応じて、最初の呼び出しの値を保持することもできます。

do
  local firstcall
  function willyield(a)
    firstcall = a
    while a do
      print(a, firstcall)
      a = coroutine.yield()
    end
  end
end

local coro = coroutine.create(willyield)
coroutine.resume(coro, 1)
coroutine.resume(coro, 10)
coroutine.resume(coro, 100)
coroutine.resume(coro)

印刷します

1 1
10 1
100 1
于 2012-11-16T21:28:00.693 に答える
5

Lua は魔法のように元の引数に新しい値を与えることはできません。最適化によっては、スタック上にない場合もあります。さらに、コードが生成されたときにコードがどこにあったかを示すものがないため、これらの引数を確認できなくなる可能性があります。たとえば、コルーチンが関数を呼び出した場合、その新しい関数は古い関数に渡された引数を認識できません。

coroutine.yield()は、コルーチンを継続する呼び出しに渡された引数を返しますresume。これにより、yield 呼び出しのサイトは、必要に応じてパラメーターを処理できます。これにより、再開を行うコードが、解放を行う特定のコードと通信できるようになります。はその引数を からのyield()戻り値として渡し、その引数を への戻り値として渡します。これにより、通信経路が設定されます。resumeresumeyield

他の方法ではできません。yield確かに、サイトから見えない可能性のある引数を変更することによってではありません。シンプルでエレガント、理にかなっています。

また、他人の価値観を詮索するのは非常に失礼だと考えられています。特に、すでに稼働している機能。覚えておいてください: 引数は、値で埋められた単なるローカル変数です。ユーザーは、変数自体が変更されない限り、これらの変数の内容が変更されることを期待すべきではありません。local結局のところ、それらは変数です。ローカルでのみ変更できます。したがって、名前。

于 2012-11-16T21:19:20.613 に答える
0

簡単な例:

co = coroutine.create (function (a, b)
       print("First  args: ", a, b)
       coroutine.yield(a+10, b+10)
       print("Second args: ", a, b)
       coroutine.yield(a+10, b+10)
     end)
print(coroutine.resume(co, 1, 2))
print(coroutine.resume(co, 3, 4))

版画:

First  args:    1       2
true    11      12
Second args:    1       2
true    11      12

argsaとの元の値bが変更されていないことを示しています。

于 2020-05-06T12:16:30.213 に答える