为何Lua中条件为真时if-then语句仍未执行?
问题排查与解决
你遇到的这种情况,通常是值的类型不一致、存在不可见字符,或是比较的是table对象导致的,下面分情况给出解决思路:
1. 类型不匹配(最常见)
Lua里的==是严格类型相等判断,比如字符串"100"和数字100打印出来看起来一样,但类型不同,==会返回false。
你可以在print语句后加上类型打印,确认两者类型是否一致:
local function hasPlayer(arr, val) for i, v in ipairs(arr) do print(val, type(val)) print(v, type(v)) if v == val then print("CODE WORKING") end end end
如果类型不同,可统一类型后再比较,比如都转成字符串:tostring(v) == tostring(val),或根据场景转成数字。
2. 存在不可见字符
有时候字符串看似一致,但可能包含空格、换行符这类不可见字符,比如"Alice "和"Alice",肉眼无法区分,但实际不相等。
可以打印字符串长度,或去掉首尾空白后再比较:
-- 打印长度确认是否一致 print(string.len(val), string.len(v)) -- 自定义trim函数去掉首尾空白 local function trim(s) return s:match'^%s*(.*%S)' or '' end local function hasPlayer(arr, val) for i, v in ipairs(arr) do print(val) print(v) if trim(v) == trim(val) then print("CODE WORKING") end end end
3. 比较的是table对象
如果v和val是table,即便内部键值对完全一致,==判断的是是否为同一个内存引用,而非内容相等。这时候需要写递归函数比较table内容:
local function isTableEqual(a, b) if type(a) ~= type(b) then return false end if type(a) ~= 'table' then return a == b end local keys = {} for k in pairs(a) do if not isTableEqual(a[k], b[k]) then return false end keys[k] = true end for k in pairs(b) do if not keys[k] then return false end end return true end local function hasPlayer(arr, val) for i, v in ipairs(arr) do print(val) print(v) if isTableEqual(v, val) then print("CODE WORKING") end end end
内容的提问来源于stack exchange,提问作者YeetMaster
相关产品推荐
相关产品推荐

