如何不在lua中将数组变成哈希(防止数组变成哈希)?
Posted
技术标签:
【中文标题】如何不在lua中将数组变成哈希(防止数组变成哈希)?【英文标题】:How to not to turn array into hash in lua (prevent array become hash )? 【发布时间】:2014-09-26 13:11:42 【问题描述】:如果我用 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"
【问题讨论】:
您不必强制使用 table.insert 等。 【参考方案1】:正如其他人已经指出的那样,Lua 只有表。在内部,您放入表中的值可能存储在其数组或哈希部分中,但这是用户无需担心的实现细节。
在您的特定情况下,键将仅存储在数组部分中(即使在分配之后),因为您没有创建任何新键。根据Lua Performance Tips(“关于表”部分)中的详细描述,初始分配将在数组部分分配 6 个插槽,然后您只需重新分配这些插槽。如果您添加var[7] = "string"
,则此值将进入散列部分,这将触发重新散列,因为此时散列部分的大小为 0。 Lua 将计算需要多少个槽来容纳数组部分中的所有值(现在为 7 个),并“选择数组部分的大小为 2 的最大幂,以便填充数组部分的一半以上元素”。数组部分现在将有 8 个插槽,而哈希部分的大小仍然为 0,因为没有元素可以去那里。
问题:这段代码是否将数组变量转换为哈希?
所以这个问题的答案是“否”(如果“变成散列”是指表得到一个非零散列部分)。如果你做var[8] = "string"
(没有分配var[7]
),散列部分的大小将非零,但如果你稍后再做var[7] = "string"
,这将触发另一个重新散列,因为这个元素不适合散列部分,所有这些元素将再次分配给数组部分。
Lua 正在努力为表格中的元素保留最合适的结构,但结构本身的更改仅在重新散列期间完成。
【讨论】:
谢谢! @paul-kulchenko 最好的答案!还有一个问题....如果我写:local var = ; for i = 1, 10000, 1 do table.insert ( var, i ) end; var[5] = some = false, another = 2 ; var[888] = @userdata; var[10000] = ; var[1] = 1
这将由 var hash 生成还是仍将是类似数组的表? (“;”符号是分开的)(我认为答案是“否”,因为正如你所写的那样,它不会触及表格的结构......这是对的吗?)
没错;您仅更改数组部分中各种元素的值,而不会更改表的结构。您可以在表中存储各种类型的值(Lua 支持的所有类型)。【参考方案2】:
您试图区分 Lua 中不存在的“数组”和“哈希”。都是桌子。其中一些只是具有并非都是正整数的键。
【讨论】:
以上是关于如何不在lua中将数组变成哈希(防止数组变成哈希)?的主要内容,如果未能解决你的问题,请参考以下文章