【发布时间】:2019-11-15 14:37:44
【问题描述】:
我发现如何在 Lua 中测试变量 nil Learn X in Y minutes,等于 ==,不等于 ~=,以及参考 here,但为什么我的代码不能那样工作?
在 docker 中启动 Redis 服务器:
PS C:\Program Files\Docker\Docker\resources\bin> .\docker.exe run --name redis-work -p 2019:6379 redis
Docker 中的 Redis 客户端
PS C:\Program Files\Docker\Docker\resources\bin> docker run -it --name redis-cli-work --link redis-work:redis --rm redis redis-cli -h redis -p 6379
第一:
redis:6379> eval 'local r = redis.call("get", "key_which_does_not_exist") return r' 0
(nil)
第二:
redis:6379> eval 'local r = redis.call("get", "key_which_does_not_exist") if r == nil then return \'nil for key\' else return r end' 0
(nil)
第三:
redis:6379> eval 'local r = redis.call("get", "key_which_does_not_exist") if r ~= nil then return r else return \'nil for key\' end' 0
(nil)
如果密钥不存在,我认为redis.call 将从第一个代码返回nil,但从第二个代码中,我认为r == nil 为假,否则它将打印' nil for key',这是否意味着r不是nil?,那么从第三个开始,由于r不是nil,为什么要打印(nil),我认为只有nil结果才能打印(nil)。
所以这个值,在客户端看起来像nil,但在服务器端,它既不是nil也不是非nil,这是什么值?
问题是如果key_which_does_not_exist不存在,那么r为假,如果lua只是把这个false返回给redis,redis客户端就会变成(nil);对于第二个代码段,如果我们想要return r,只有当r == nil为false,那么r为false使得r == nil为false,我们返回r导致返回false,redis将false转换为再次(nil);对于最后一个,r 为 false 使 r ~= nil 为 true,然后 lua return r,实际上返回 false 到 redis,redis 隐蔽 false 到 (nil)。
问题是,在lua中,false不是nil,在redis中,来自lua的false会被转换成(nil)
【问题讨论】: