2016-07-14 51 views
2

設置通過運行SADD A B CRedis的Lua的腳本拆開返回不同的結果

當我靠在設置 keystoclear1中有「b」的一個單一的值執行該代碼。 keystoclear2作爲它的兩個值。

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上測試了這個。在所有情況下都是一樣的。這是一個微不足道的例子,我實際上想要存儲unpack的結果,因爲我需要對它執行幾個操作。

更新:我明白這個問題。

table.unpack() only returns the first element

的Lua總是調整結果的數量從一個函數調用的情況。當我們調用一個函數作爲一個語句時,Lua放棄了它的所有結果。當我們將一個調用用作表達式時,Lua只保留第一個結果。只有當調用是表達式列表中的最後(或唯一)表達式時,我們纔會獲得所有結果。

回答

1

這種情況與您在更新中引用的情況略有不同。在這種情況下,unpack(可能)會返回多個元素,但您只存儲一個元素並放棄其餘元素。如果使用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'中的第一個元素,這是OP現在的功能。 –