[缺少值时函数不返回消息

问题描述 投票:1回答:2

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

这里是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字符串没有匹配的单词,则该函数不返回任何内容。甚至没有消息There's nothing

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

function lua lua-table
2个回答
4
投票

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

一种解决方案是仅将搜索字符串放入表中并在循环内调用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)

1
投票

使用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

© www.soinside.com 2019 - 2024. All rights reserved.