【问题标题】:LUA: trying to remove a value from a table when it is found in another tableLUA:当在另一个表中找到值时尝试从表中删除该值
【发布时间】:2019-02-04 12:55:06
【问题描述】:

当我在另一个表中找到一个表时,我试图从一个表中删除它。到目前为止,我一直在使用它,但尽管它可以识别重复项,但它总是会删除表中的最后一项...

function get_key_for_value( t, value )
 for k,v in pairs(t) do
 if v==value then return k
 end
 return nil
 end
 end

 for k,v in pairs (Iranian_Protected_Groups) do
 v[6] = 0
 if Springfield_3_Target_Name == v[2] then
 v[6] = v[6] + 1
 if v[6] > 0 then
 local Key_To_Remove = get_key_for_value (Iranian_Protected_Groups, v)
 MESSAGE:New( "Shared target is "..v[2], 40):ToBlue()
 table.remove (Iranian_Protected_Groups, Key_To_Remove)
 end
 end
 end

任何帮助将不胜感激!

【问题讨论】:

    标签: lua


    【解决方案1】:

    首先,您应该使用标准缩进来格式化您的代码,以便于人类阅读代码时更容易解析:

    function get_key_for_value(t, value)
        for k, v in pairs(t) do
            if v == value then
                return k
            end
            return nil
        end
    end
    

    仔细查看for 循环。您将永远通过第一次次迭代,因为每一次次迭代returns。

    如果您将 return nil 语句移到循环之外,您的函数将得到修复。 (虽然对于大多数目的来说,是多余的,因为通常没有值等于返回 nil)。

    之前,Key_To_Removenil。当传递nil 作为table.remove 中要删除的索引时,Lua 会删除最后一个元素。这在将列表视为堆栈时很方便,但在这种情况下为您隐藏了一个错误。

    【讨论】:

    • 非常感谢柯蒂斯..用“--”解决了我的问题!。在任何情况下使用“return nil”会有用吗?
    • 原来不返回和返回nil是有区别的。您可以通过select("#", (function () end)())select("#", nil) 看到它。通常你不会编写关心差异的 Lua 代码,但每个内置函数(在 C 中定义)都会关心,所以有时你会得到稍微不同的行为。但是,这仅适用于您直接将函数传递给另一个函数的情况。一旦你把它保存到一个变量中,“nothing”就变成了nil
    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2013-09-05
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    相关资源
    最近更新 更多