gpt4 book ai didi

redis - 为什么 nil 检查失败

转载 作者:IT王子 更新时间:2023-10-29 06:03:48 25 4
gpt4 key购买 nike

我正在使用 Lua 查询 redis 并想检查是否有键不存在,但我对为什么我的代码不起作用感到困惑:

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 时结束。因此,v 在您的 for 循环中永远不会等于 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

returnreturn 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]0false,在这种情况下,您可以将其替换为 0 .

快速研究确认您从 Redis Lua 绑定(bind)中得到的是错误值而不是 nil。所以使用 ipairs 应该没问题。您应该只检查值是否等于 false,而不是 nil

关于redis - 为什么 nil 检查失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55591195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com