如果我用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"
答案 0 :(得分:2)
正如其他人已经指出的那样,Lua只有桌子。在内部,您放在表中的值可以存储在其数组或散列部分中,但它是用户无需担心的实现细节。
在您的特定情况下,键将仅存储在数组部分中(即使在分配后),因为您没有创建任何新键。根据{{3}}(“关于表格”部分)中的详细描述,初始赋值将在数组部分中分配6个插槽,然后您只需重新分配这些插槽。如果添加var[7] = "string"
,则此值将进入哈希部分,这将触发重新哈希,因为此时哈希部分的大小为0。 Lua将计算需要多少个插槽来容纳阵列部分中的所有值(现在为7),“选择数组部分的大小为2的最大功率,以便填充阵列部分的一半以上的元素”。数组部分现在有8个插槽,散列部分的大小仍为0,因为没有元素可以去那里。
问题:此代码是否将数组变量转换为哈希?
所以这个问题的答案是“不”(如果通过“变成哈希”你的意思是表得到一个非零的哈希部分)。如果你执行var[8] = "string"
(没有分配var[7]
),哈希部分将获得非零大小,但如果您稍后执行var[7] = "string"
,这将触发另一个重新哈希,因为此元素赢了不适合散列部分,所有这些元素将再次分配给数组部分。
Lua正在努力为表中的元素保留最合适的结构,但结构本身的更改只在重新散列过程中完成。
答案 1 :(得分:1)
你试图区分Lua中不存在的“数组”和“哈希”。他们都是桌子。他们中的一些人只拥有不是正整数的键。