arrays - 如何在lua中不将数组变成散列(防止数组变成散列)?

标签 arrays hash lua lua-table

如果我用Lua写

local var = {1,2,3,4,5,6}

变量var是数组。

如果我想将其保留为数组(而不是散列),我必须使用 table.insert、table.remove 等。

此代码会将其转换为哈希:

var["key"] = 4

问题: 这段代码是否将数组变量转换为哈希值?

local var = {1,2,3,4,5}
var[4] = "string"
var[6] = "string"
var[1] = "string"

最佳答案

正如其他人已经指出的,Lua 只有表。在内部,您放入表中的值可能存储在其数组或哈希部分中,但这是用户不需要担心的实现细节。

在您的特定情况下,键将仅存储在数组部分中(即使在分配之后),因为您没有创建任何新键。根据Lua Performance Tips中的详细描述(“关于表”部分),初始分配将在数组部分分配 6 个槽,然后您只需重新分配它们即可。如果添加 var[7] = "string",则该值将进入哈希部分,这将触发重新哈希,因为此时哈希部分的大小为 0。 Lua 将计算需要多少个槽来容纳数组部分中的所有值(现在是 7 个),并“选择 2 的最大幂作为数组部分的大小,以便填充数组部分的一半以上的元素”。数组部分现在将有 8 个槽,而散列部分的大小仍为 0,因为没有元素可放入其中。

QUESTION: Does this code turn array variable into hash?

所以这个问题的答案是“否”(如果“变成散列”意味着该表获得非零散列部分)。如果您执行 var[8] = "string" (未分配 var[7]),则哈希部分将获得非零大小,但如果您稍后执行 var[7] = "string",这将触发另一个重新哈希,因为该元素不适合哈希部分,所有这些元素将再次分配给数组部分。

Lua 正在努力为表中的元素保留最合适的结构,但结构本身的更改仅在重新哈希期间完成。

关于arrays - 如何在lua中不将数组变成散列(防止数组变成散列)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25112293/

相关文章:

javascript - 将js文件中的数组Fatch到php中,然后编码成json

php - 什么原因导致 : "Notice: Uninitialized string offset" to appear?

ruby - 解决二维哈希的问题

perl - 寻找一种更有效的方法来过滤掉 perl 哈希

c++ - 为什么 clang 拒绝 gcc 接受的这个 unordered_set 定义?

plugins - 为魔兽世界开发插件 - 开始?

c++ - 将 Lua 嵌入 C++

java - 当我尝试运行这个程序时,是什么导致了我的 java.lang.NullPointerException 错误?

javascript - 是否存在 Array.isArray() 不起作用的情况?

post - 如何在 nginx (HttpLuaModule) 中检查 POST 正文