💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥
文章目录
- Lua | 每日一练 (1)
- 题目
- 参考答案
Lua | 每日一练 (1)
题目
详细说明 lua
中表的索引机制,以及如何区分表的数组部分和哈希部分。此外,解释 lua
中表的索引从1开始的原因。
参考答案
在 lua
中,表是一种非常灵活的数据结构,既可以作为数组(数组部分)使用,也可以作为哈希表(哈希部分)使用。表的索引机制基于键值对,其中键可以是任意类型(除了 nil
),值也可以是任意类型。
-- 创建一个表,包含数组部分和哈希部分
local myTable = {"apple", -- 数组部分,索引为 1"banana", -- 数组部分,索引为 2"cherry", -- 数组部分,索引为 3fruit = "orange", -- 哈希部分,键为字符串 "fruit"[4] = "date", -- 数组部分,索引为 4(虽然不是连续的,但仍然是数组部分)[10] = "grape", -- 哈希部分,索引为 10(非连续整数)[true] = "boolean_key", -- 哈希部分,键为布尔值[3.14] = "float_key" -- 哈希部分,键为浮点数
}-- 使用 ipairs 遍历数组部分
-- 1 apple
-- 2 banana
-- 3 cherry
-- 4 date
for index, value in ipairs(myTable) doprint(index, value)
end-- 使用 pairs 遍历整个表(包括数组部分和哈希部分)
-- 1 apple
-- 2 banana
-- 3 cherry
-- fruit orange
-- 10 grape
-- 4 date
-- 3.14 float_key
-- true boolean_key
for key, value in pairs(myTable) doprint(key, value)
end
从上面的代码中可以看出,对于 [4] = "date"
来说作为数组部分进行存储,而对于 [10] = "grape"
当作哈希部分存储;实际上lua
在表的内部中会根据索引的连续性和密度来动态决定哪些键值对存储在数组部分,哪些存储在哈希部分。
具体规则如下:
- 数组部分的定义:
- 数组部分是指表中连续的整数索引,通常从
1
开始。 lua
会尝试将连续的整数索引优化为数组部分,因为数组部分的存储和访问效率更高。
- 数组部分是指表中连续的整数索引,通常从
- 哈希部分的定义:
- 哈希部分用于存储非连续的整数索引或非整数键(如字符串、浮点数、布尔值等)。
- 哈希部分的存储和访问基于哈希表机制,时间复杂度通常为
O(1)
。
- 动态区分机制:
lua
的表在内部维护一个数组部分和一个哈希部分。- 当表的索引是连续的整数时,
lua
会尽量将这些索引存储在数组部分。 - 如果表中存在非连续的整数索引或非整数键,这些键值对会被存储在哈希部分。
根据以上规则也就可以解释执行打印的结果原因,另外也有一些在实际使用过程中的注意事项:
- 数组部分的边界:
lua
会根据表的使用情况动态调整数组部分和哈希部分的边界。例如,如果数组部分的索引被删除,lua
可能会将其视为哈希部分。 #
运算符:#
运算符只能获取数组部分的长度,不会考虑哈希部分的键值对。例如:
local myTable = {"apple","banana","cherry",fruit = "orange",[4] = "date",[10] = "grape",[true] = "boolean_key",[3.14] = "float_key"
}print(#myTable) -- 4
最后对于 lua
表中索引从1开始,而不是类似于 c/c++
、golang
那样从0开始,经过在官方或者其他网站的查询结果,总结了这样设计的原因主要有:
- 使用习惯:在日常生活中,人们通常从
1
开始计数,例如“第一项”、“第二项”。从1
开始的索引更符合人类的直觉。 - 表达便捷:从
1
开始的索引可以简化数学表达式。例如,访问第n
个元素时,可以直接使用array[n]
,而不需要像从0
开始的索引那样使用array[n-1]
。 - 历史原因:
lua
的设计受到Pascal
等早期语言的影响,这些语言的数组索引也是从1
开始的。
Pascal
是一种过程式编程语言,由Niklaus Wirth
于1968年设计并于1970年发布,并以法国数学家和哲学家Blaise Pascal
的名字命名。
🌺🌺🌺撒花!
如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。