检查单词是否在 lua 中的数组中

Checking if a word is in a array in lua

我试图在数组中找到一个包含“orange”的单词。它有效,但是当我添加 else 语句以显示消息“找不到匹配项”时,我得到了这个结果。

matches not found
x-orange-test
orange
new_orange
matches not found

我做错了什么?如果数组中存在“橙色”,为什么我会收到“找不到匹配项”的消息?

逻辑是这样的:如果数组中至少有一个元素带有单词“orange”,则只打印这些元素。如果数组不包含带有单词“orange”的元素,则打印 一行“找不到匹配项” 对不起,我是 LUA 的新手。我的代码。

local items = { 'apple', 'x-orange-test', 'orange', 'new_orange', 'banana' }
    
    for key,value in pairs(items) do
        if string.match(value, 'orange') then
            print (value)
        else
            print ('matches not found')
        end
    end

相当于 Python 代码,对找到的元素的总和进行了轻微修正。它按照我需要的方式工作。但我需要弄清楚如何在 LUA

中做同样的事情
#!/usr/bin/env python3
items = ['apple', 'x-orange-test', 'orange', 'new_orange', 'banana']

if any("orange" in s for s in items):
    sum_orange = sum("orange" in s for s in items)
    print (sum_orange)
else:
    print('matches not found')

提前致谢。

您的 lua 代码打印 table 中每个元素的结果,因此您将收到两倍的“未找到”消息,因为确实有两个元素没有橙色。

您的 Python 代码使用了完全不同的逻辑,无法与 lua 代码进行比较。要修复 lua 代码,您可以使用如下代码:

found = false
for key,value in pairs(items) do
    if string.match(value, 'orange') then
        print (value)
        found = true
    end
end
if not found then
    print ('matches not found')
end

对于第一个代码,您将遍历集合中的每个项目并检查项目中是否包含“orange”。因此,当您到达不包含单词“orange”的 am item 时,else 条件为真,因此打印未找到的匹配项。我建议您从 for 循环中删除 print('matches not found') 。而是创建一个布尔值来检查是否在集合中的任何项目中找到“橙色”。在 for 循环之外,你可以检查布尔值是否为假,然后打印 'match not found.' 见下面的代码:

local items = { 'apple', 'x-orange-test', 'orange', 'new_orange', 'banana' }
local matchFound = false

    for key,value in pairs(items) do
        if string.match(value, 'orange') then
            print (value)
            matchFound = true
        end
    end

    if not matchFound then
        print('matches not found')

你可以像这样匹配迭代器。

-- table method extend
---@param t string[]
---@param value string
function table.find(t, value)
    if type(t) ~= "table" or t[1] == nil then
        error("is not a array")
        return
    end

    for k, v in ipairs(t) do
        if v == value then
            return true, t[k]
        end
    end
    return false, nil
end

local items = {
    "apple",
    "x-orange-test",
    "orange",
    "new_orange",
    "banana"
}

print(table.find(items, "orange"))
--> true orange

print(table.find(items, "orange-odd"))
--> false nil