【问题标题】:Why do I get this "attempt to call a table value" when iterating through a table?为什么在遍历表时会出现这种“尝试调用表值”?
【发布时间】:2019-09-24 15:20:09
【问题描述】:

我正在尝试在 Garry 的 mod Lua 中查找与表的值关联的键,但我收到一个错误,就好像它不是表一样。

这是针对我正在维护/修复的其他人代码上的游戏崩溃错误的更大解决方案的一部分。

长话短说,我需要根据它的值来获取密钥的编号。有这个问题的简单短代码:


function starttest()
     local tbl = {"a", "b", "c"}

     local printme = FindValueInTable(tbl, "c")

print(printme)

end

function FindValueInTable(table, value)
     for k, v in table do --errors on this line saying "attempt to call a table value"
          if v == value then
               return k
          end
     end
     return nil
end

我不知道在这里做什么,因为table 实际上是一张桌子,for k,v in table 怎么会真的失败?

我期望的结果是它返回具有value 值的数字键。所以如果value == "c"table[3] 恰好有"c" 的值,那么它应该返回3 作为结果。

【问题讨论】:

  • 您需要提供可用于重现问题的最小完整脚本。当您尝试提出最小脚本时,您通常会自己找到解决方案。
  • @PaulKulchenko 我现在已经对这篇文章进行了大量编辑以做到这一点。但是,我没有找到解决方案。

标签: lua lua-table garrys-mod


【解决方案1】:

您需要使用for k, v in ipairs(table) do 而不是for k, v in table do,因为这种形式的for 循环在in 之后需要一个迭代器,因此尝试“调用”您的table 变量,这会导致错误.

【讨论】:

  • 为什么是ipairs()
  • 因为在这种情况下似乎就足够了。
  • 标记为答案;导致非常相似的事情解决了它。在我的情况下不是ipairs,因为我对gmod使用了稍微不同的lua,但pairs()工作正常。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多