如何使用解包调用具有变长参数的方法

我正在尝试运行一个 Redis Lua 模拟项目来测试我的 Redis Lua 代码,但是显然 redis-mock 项目中存在错误。

在我的测试代码中调用 redis.call('hget', 'foo', 'bar') 时,redis-mock 在 hash.lua#22 报告了一个断言错误,该错误被调用自 RedisLua.lua#20

-- RedisLua.lua
local call = function(self)
  return (function(cmd, ...)
    cmd = string.lower(cmd)

    local arg = {...}

    local ret = self.db[cmd](self.db, unpack(arg)) -- line 20

    if self.RedisLua_VERBOSE then
      print(cmd .. "( " .. table.concat(arg, " ") .. " ) === ".. tostring(ret))
    end

    return ret
  end)
end

-- hash.lua
function RedisDb:hget(self,k,k2)
    assert((type(k2) == "string")) -- # line 22
    local x = RedisDb.xgetr(self,k,"hash")
    return x[k2]
end

跟踪后,我发现 self'foo'k'bar'k2 实际上是 nil。 我该如何修复此错误? k 应该是 fook2 应该是 'bar'

点赞
用户221955
用户221955

我认为你需要调用 redis:call('hget', 'foo', 'bar') 或等效的 redis.call(redis,'hget','foo','bar'),而不是 redis.call('hget', 'foo', 'bar')

2013-03-13 07:27:28
用户443966
用户443966

当定义为 : 的时候,不需要使用 self

-- hash.lua
function RedisDb:hget(self,k,k2)
    assert((type(k2) == "string")) -- # line 22
    local x = RedisDb.xgetr(self,k,"hash")
    return x[k2]
end

修改为

-- hash.lua
function RedisDb:hget(k,k2)
    assert((type(k2) == "string")) -- # line 22
    local x = RedisDb:xgetr(k,"hash")
    return x[k2]
end
2013-03-13 09:12:05