在 Redis 中使用 string.gsub 作为 redis.call() 的参数时出错

我有一个简单的 Lua 脚本,如下所示:

local json = redis.call('GET', KEYS[1])
if json == false then
    return nil
end
local newJson = string.gsub(json, '"isViewed":false', '"isViewed":true', 1)
return redis.call('SET', KEYS[1], newJson)

这个脚本按预期工作。

但是,如果我跳过 newJson 的声明,直接转到:

local json = redis.call('GET', KEYS[1])
if json == false then
    return nil
end
return redis.call('SET', KEYS[1], string.gsub(json, '"isViewed":false', '"isViewed":true', 1))

然后我从 Go "Redigo" Redis 客户端得到这个错误:

ERR Error running script (call to f_3dc195393616dc1f56a13d6c471e0b68b3e4c8b3): @user_script:5: ERR syntax error

为什么会这样?根据这个页面,string.gsub 只是返回一个字符串:

https://docs.coronalabs.com/api/library/string/gsub.html

点赞
用户2858170
用户2858170

在纯 Lua 中,string.gsub 返回 2 个值。也许 Corona 的文档不正确?

第一个返回值是被修改过的字符串。 第二个返回值是发生的匹配次数。

local newJson = string.gsub(json, '"isViewed":false', '"isViewed":true', 1)
return redis.call('SET', KEYS[1], newJson)

在这里,你只传递第一个返回值给 redis.call。

而在下面的调用中,你会把两个返回值都传递给 redis.call,这会导致错误。

redis.call('SET', KEYS[1], string.gsub(json, '"isViewed":false', '"isViewed":true', 1))

尝试 print(string.gsub(json, '"isViewed":false', '"isViewed":true', 1)) 来查看你实际上有多少个返回值。

2016-05-21 13:35:01