我正在使用 Lua 查询 Redis,并想检查 key 是否不存在,但我很困惑为什么我的代码无法正常工作:
local bulk = redis.call("HMGET", KEYS[1], "p1", "p2")
for i, v in ipairs(bulk) do
if (i == 1) then
if (v == nil) then
return nil -- This is never entered
end
end
end
但是下面的代码确实有效:
local bulk = redis.call("HMGET", KEYS[1], "p1", "p2")
for i, v in ipairs(bulk) do
if (i == 1) then
v = v or 0
if (v == 0) then
return nil -- This does work
end
end
end
这是怎么回事?
最佳答案
您正在使用ipairs
来迭代您的表。迭代将在第一个 nil
元素处结束。因此,在 for 循环中 v
永远不能等于 nil。
因此您永远不会输入 if (v== nil)
语句。
From the Lua Reference Manual 6.1 Basic Functions :
ipairs (t) Returns three values (an iterator function, the table t, and 0) so that the construction
for i,v in ipairs(t) do body end
will iterate over the key–value pairs (1,t[1]), (2,t[2]), ..., up to the first nil value.
实际上,您不能使用任何标准迭代器来查找 nil 值。
如果您只想检查 bulk[1]
是否为 nil
:
替换
local bulk = redis.call("HMGET", KEYS[1], "p1", "p2")
for i, v in ipairs(bulk) do
if (i == 1) then
if (v == nil) then
return nil -- This is never entered
end
end
end
与
local bulk = redis.call("HMGET", KEYS[1], "p1", "p2")
if not bulk[1] then return end
return
和 return nil
顺便说一句是相同的。
如果bulk[1]
可能是有效的false
,请显式检查与nil
。
if bulk[1] == nil then return end
这段代码:
local bulk = redis.call("HMGET", KEYS[1], "p1", "p2")
for i, v in ipairs(bulk) do
if (i == 1) then
v = v or 0
if (v == 0) then
return nil -- This does work
end
end
end
之所以有效,是因为 bulk[1]
是 0
或 false
,在这种情况下,您可以将其替换为 0
.
快速研究确认您从 Redis Lua 绑定(bind)中获得的是 false 值而不是 nil。所以使用 ipairs 应该没问题。您应该只检查该值是否等于 false
,而不是 nil
。
关于redis - 为什么 nil 检查失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55591195/