函数在值缺失时不返回消息

我正试图检查字符串中是否存在特定的单词。到目前为止,我创建了一个函数,将单词出现在字符串中的情况存储在测试表中,然后如果单词在字符串中,则该函数会打印一条消息,否则会打印另一条消息。

这是MWE:

stg = "在这个字符串中可以找到单词天空、狗、青蛙"

function highlight(str)
    local test = {str:find("sky"),str:find("car"),str:find("glass")}
    local start, fim
    for k, v in ipairs(test) do
        if v ~= nil then
            print("有东西")
        elseif v == nil then
            print("什么也没有")
        end
    end
end

highlight(stg)

奇怪的是:函数只能识别正在检查的第一个单词,即单词“天空”。如果stg字符串没有任何匹配的单词,则函数将不返回任何内容。甚至没有消息“什么也没有”。

如何使函数正确地检查单词在字符串中的存在或不存在并正确打印消息?

点赞
用户1944004
用户1944004

使用 table.pack 并按索引迭代。

--[[
-- Lua 5.1和LuaJIT
function table.pack(...)
    return { n = select("#", ...), ... }
end
--]]

stg = "在这个字符串中可以找到sky,dog,frog这些单词"

function highlight(str)
    local test = table.pack((str:find("sky")),(str:find("car")),(str:find("glass")))
    for n = 1, test.n do
        local v = test[n]
        if v ~= nil then
            print("有些东西")
        else
            print("没有")
        end
    end
end

highlight(stg)

Wandbox上的实时示例

2020-01-01 01:48:09
用户3574628
用户3574628

ipairs 迭代器会在找到 nil 值时停止,但 string.find 有时会返回 nil。这意味着在你的循环体内,v 永远不可能是 nil

一个解决方案是只将搜索字符串放入表中,并在循环内调用 string.find

stg = "在这个字符串中,可以找到单词天空、狗和青蛙"

function highlight(str)
    local test = {"天空","汽车","玻璃"}
    for k, v in ipairs(test) do
        if str:find(v) then
            print("有东西")
        else
            print("没有东西")
        end
    end
end

highlight(stg)
2020-01-01 02:00:31