【问题标题】:Assigning subtables to unknown indices in Lua将子表分配给 Lua 中的未知索引
【发布时间】:2023-04-01 12:28:01
【问题描述】:

我是 Lua 脚本的新手,我正在尝试将索引值分配给空表中的索引,如下所示:

table = {}
table[6].id = 231

附言上面的代码是使用 MOOSE 框架对一个更大的数字战斗模拟器脚本的简化。

我收到以下日志消息:

... DCS:任务脚本错误:...尝试索引字段“?” (零 值)

对不起,如果它看起来很愚蠢,但我找不到它有什么问题。 我什至需要先声明表格吗?

谢谢

【问题讨论】:

  • 注意:Lua 中唯一“声明”的是局部变量(相对于全局变量)。而且,Lua 中唯一“定义”的是一个函数定义,它在执行时创建一个函数值。您的意思可能是“构造”一个​​表,类似地,在执行表构造表达式时创建一个表值。

标签: lua lua-table


【解决方案1】:

语法正确,但您访问的是 nil 值:table[6] 当前为 nil,因此您的代码执行类似操作

nil.id = 231

这显然是不可能的。先定义子表:

table = {}
table[6] = {}
table[6].id = 231

或使用子表的构造函数:

table = {}
table[6] = { id = 231 }

注意table是lua中预定义的库表,所以你应该使用不同的名字。

【讨论】:

  • 我想用 id 作为键。不应该是:table[6] = { ['id'] = 231 } id 不会被解释为变量吗?有没有更简单的方式来表达['id']?
  • 因为 'id' 是一个有效的变量名,所以相当于写成id = 231['id'] = 231。见lua.org/manual/5.3/manual.html#3.4.9
  • 当然,元表无论如何都可以对事物进行哈希处理。
【解决方案2】:

另一个答案是正确的,我建议您采用那里介绍的方法。


您还可以使用元表自动为未知索引创建表。

local create_unknown
create_unknown = {
    __index = function(t,k)
        if not rawget(t,k) then
            rawset(t,k,setmetatable({},create_unknown))
        end
        return rawget(t,k)
    end
}

tab = setmetatable({},create_unknown)

tab[6].id = 231
tab[6].what["is"].happening = 123

print(tab[6].id)
print(tab[6].what["is"].happening)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-07
    • 2021-11-23
    • 2015-02-26
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2011-06-24
    • 2016-07-28
    相关资源
    最近更新 更多