6

関数からいくつかの追加の戻り値を取得し、後でそれらを転送したいコードがいくつかあります。

local ok, ... = coroutine.resume(co)
do_stuff(ok)
return ...

ただし、...変数の割り当ては構文エラーであるため、これは実行されません。

この制限を回避するには、古い「関数の引数と変数は同等です」というトリックと、すぐに呼び出される関数を使用します。

return (function(ok, ...)
    do_stuff(ok)
    return ...
)(coroutine.resume(co))

しかし、そうすることはあまり慣用的でも効率的でもないと思います。resume呼び出しから返された残りの値を処理するというこの問題を解決するためのより合理的な方法はありますか?

EDIT:ちなみに、これnilは追加の引数の値で動作する必要があります

EDIT2:すぐに呼び出される関数を使用することがずっと最善の方法だったようです。

4

2 に答える 2

5

私見、最善の方法は、質問で行ったように、vararg をパラメーターとしてヘルパー関数に渡すことです。
別の方法は「pack-unpack」です。

-- Lua 5.2 only
local t = table.pack(coroutine.resume(co))
do_stuff(t[1])
return table.unpack(t, 2, t.n)
于 2013-01-29T10:38:21.290 に答える
2

不明な数の戻り値を使用してこれを行う慣用的な方法は、関数呼び出しをテーブルコンストラクターでラップすることです。

local t = { coroutine.resume(co) }
do_stuff(table.remove(t, 1)) 
return unpack(t)  -- table.unpack(t) in lua 5.2

これには一時オブジェクトの作成も含まれますが、クロージャーを使用するよりもはるかに高速である必要があり、確かに非常に優れています。

于 2013-01-29T08:57:36.470 に答える