2016-07-14 6 views
2

セットアップを返します。 keystoclear2は両方の値として です。私は何もでていないのRedisのLuaスクリプトを開梱し、私は keystoclear1はそれに「B」の単一の値を持つセットに対してこのコードを実行すると、BのC</p> <p>をサッド実行することにより、異なる結果

local keystoclear = unpack(redis.call('smembers', KEYS[1])) 

redis.call('sadd', 'keystoclear1', keystoclear) 

redis.call('sadd', 'keystoclear2', unpack(redis.call('smembers', KEYS[1]))) 

はLuaの専門家を意味し、私はちょうどここにいくつかの奇妙な振る舞いを持つことができますが、私はそれを引き起こしているかを知りたいと思います。

これは、redis-cliとstackexchange.redisクライアントを使用して、WindowsとLinuxの両方のバージョンのredisでテストしました。すべてのケースで同じ動作。これはほんの一例ですが、私は実際にアンパックの結果を保存したいのですが、いくつかの操作を実行する必要があるからです。

更新:問題を理解しています。

table.unpack() only returns the first element

Luaは常にコールの状況に関数から結果の数を調整します。関数を文として呼び出すと、Luaはすべての結果を破棄します。式として呼び出しを使用すると、Luaは最初の結果のみを保持します。呼び出しが式のリストの最後の(または唯一の)式である場合のみ、すべての結果が得られます。

答えて

1

このケースは、あなたのアップデートで参照したものと少し異なります。この場合、unpack(may)はいくつかの要素を返しますが、1つしか保存して残りの要素は破棄しません。あなたがlocal keytoclear1, keytoclear2 = ...を使用する場合は、他の要素を取得することができますが、必要に応じて、それは、テーブル自体を保存し、それを解凍するためにはるかに簡単です:

local keystoclear = redis.call('smembers', KEYS[1]) 
redis.call('sadd', 'keystoclear1', unpack(keystoclear)) 

限りunpackが最後のパラメータであるとして、あなたはすべての要素を取得しますテーブルの中に存在するものが解凍されています。

+0

'redis.call( 'sadd'、 'keystoclear1'、(unpack(keystoclear)))' – moteus

+0

@moteusを呼び出すと、これは 'keystoclear'の最初の要素です。 。 –

関連する問題