缺少值时函数不会 return 消息

Function doesn't return message when value is missing

我正在尝试检查字符串中是否有某些单词。到目前为止,我创建了一个函数,该函数存储在 table 测试字符串中是否存在单词,如果字符串中存在该单词,则该函数打印一条消息,否则打印其他消息。

这是 MWE:

stg = "In this string the words sky, dog, frog can be found"

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("There's something")
        elseif v == nil then
            print("There's nothing")
        end
    end
end

highlight(stg)

奇怪的是:该函数只识别第一个正在检查的单词,即单词sky。如果 stg 字符串有 none 的匹配词,函数 returns 什么都没有。甚至没有消息 There's nothing.

如何使函数检查字符串中是否存在单词并正确打印消息?

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

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

stg = "In this string the words sky, dog, frog can be found"

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("There's something")
        else
            print("There's nothing")
        end
    end
end

highlight(stg)

Live example on Wandbox

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

一种解决方案是仅将搜索字符串放入 table 并在循环内调用 string.find

stg = "In this string the words sky, dog, frog can be found"

function highlight(str)
    local test = {"sky","car","glass"}
    for k, v in ipairs(test) do
        if str:find(v) then
            print("There's something")
        else
            print("There's nothing")
        end
    end
end

highlight(stg)