gpt4 book ai didi

c++ - Lua/c++ 处理命名数组条目的问题

转载 作者:太空宇宙 更新时间:2023-11-04 15:28:53 25 4
gpt4 key购买 nike

我正在尝试编写一些与 LUA 交互的 C++ 类,但我对以下内容感到困惑:

在下面的例子中:Wherigo.ZCommand 返回一个“Command”对象,同样 zcharacterFisherman.Commands 是一个 Command 对象数组:

使用以下 LUA 代码,我理解它并且它正常工作(luaL_getn 在 zcharacterFisherman.Commands c++ set newindex 函数中返回 3):

zcharacterFisherman.Commands = {
Wherigo.ZCommand{a="Talk", b=false, d=true, c="Nothing available"},
Wherigo.ZCommand{a="Talk", b=false, d=true, c="Nothing available"},
Wherigo.ZCommand{a="Talk", b=false, d=true, c="Nothing available"},
}

但是,当使用语法略有不同的 LUA 代码定义数组时,luaL_getn 返回 0。

zcharacterFisherman.Commands = {
Talk = Wherigo.ZCommand{a="Talk", b=false, d=true, c="Nothing available"},
Talk2 = Wherigo.ZCommand{a="Talk", b=false, d=true, c="Nothing available"},
Talk3 = Wherigo.ZCommand{a="Talk", b=false, d=true, c="Nothing available"},
}

所有对象都在 C++ 中定义,C++ 对象包含所有对象成员,因此我试图将 LUA 连接到那些 C++ 对象。这够了吗,还是我需要发布我的一些代码??

最佳答案

Lua 是正确的。

您的第一个示例正在形成一个表,该表恰好包含索引为 1、2 和 3 的三个条目,其中没有一个是明确指定的。在这种情况下 table.maxn() , #运算符,和 lua_objlen()所有人都同意有三个数组元素。

您的第二个示例正在形成一个表,该表恰好包含三个索引为“Talk”、“Talk2”和“Talk3”的条目,所有条目均明确指定,但没有一个是整数。在这种情况下,table.maxn() , #运算符,和 lua_objlen()所有人都同意数组元素为零。

为什么这是正确答案?

阿卢阿table是一个关联数组,可以将任何类型的值(nil 除外)映射到任何类型的值(同样,nil 除外)。 Lua 中没有其他通用容器类型,因此表基本上用于所有内容。该实现不是 Lua 规范的一部分,但实际上一个表被索引为一个哈希表,并且没有键的自然排序。

但是,表的一个常见用例是作为一个容器,就像一个传统的数组。这样的容器具有连续的整数索引,并且可以按顺序迭代。表实现使得这对于从 1 开始的整数键特别有效。 .表中的这些条目在物理上被分配为一个连续的数组,并且键既不散列也不存储。这节省了分配开销和根本不存储一些 key 的存储空间。它还节省了运行时间,因为访问是通过直接计算而不是通过计算哈希和验证匹配值来进行的。

由于数组只是表,表初始化器语法旨在使这种情况变得简单明了,并支持其他常见用例,其中键是恰好是有效标识符的字符串。

Lua 5.1 与 Lua 5.0

在当前的 Lua 版本(5.1.4,但所有 5.1 版本都是如此)中,Lua 5.0 函数 table.getn() , table.setn() , luaL_getn() , 和 luaL_setn()都是deprecated ,这是表字段的常见用法 n为数组指示其数组长度。 table.getn()功能被替换为 #运算符,和 luaL_getn()通过 lua_objlen() .没有等同于 setn() 的东西功能,因为 Lua 现在在幕后管理数组大小。

#运算符在表上定义为返回一个整数,这样通过下一个更大的整数索引表返回 nil .对于空数组(例如 a = {} ),它返回 0 因为 a[1] == nil .对于普通数组,它返回正在使用的最大索引。但是,如果数组有空洞(缺少元素),则它可以返回任何空洞之前的索引或使用的最后一个索引。如果需要实际使用的最大整数索引,则新函数 table.maxn()可以使用,但它必须遍历所有表条目以找到最大值,因此只能在使用 # 时使用不能。

这导致了现在常见的向数组添加元素的习惯用法:a[#a+1] = "some new value" .这个成语现在经常被推荐用来代替 table.insert()用于扩展表格。

关于c++ - Lua/c++ 处理命名数组条目的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/947802/

25 4 0
文章推荐: HTML5 Canvas - 放大一个点
文章推荐: html - 使 div 填充父高度(jsfiddle)
文章推荐: css - 位置 : absolute element 内的水平居中
文章推荐: html - 为可访问的 编写准确的