Lua | 面试题每日一练 (1)

💢欢迎来到张胤尘的技术站

💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

Lua | 每日一练 (1)

题目

详细说明 lua 中表的索引机制,以及如何区分表的数组部分和哈希部分。此外,解释 lua 中表的索引从1开始的原因。

参考答案

在 lua 中,表是一种非常灵活的数据结构,既可以作为数组(数组部分)使用,也可以作为哈希表(哈希部分)使用。表的索引机制基于键值对,其中键可以是任意类型(除了 nil),值也可以是任意类型。

lua 复制代码
-- 创建一个表,包含数组部分和哈希部分
local myTable = {
    "apple",                -- 数组部分,索引为 1
    "banana",               -- 数组部分,索引为 2
    "cherry",               -- 数组部分,索引为 3
    fruit = "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) do
    print(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) do
    print(key, value)
end

从上面的代码中可以看出,对于 [4] = "date" 来说作为数组部分进行存储,而对于 [10] = "grape" 当作哈希部分存储;实际上lua 在表的内部中会根据索引的连续性 和密度来动态决定哪些键值对存储在数组部分,哪些存储在哈希部分。

具体规则如下:

  • 数组部分的定义 :
    • 数组部分是指表中连续的整数索引 ,通常从 1 开始。
    • lua 会尝试将连续的整数索引优化为数组部分,因为数组部分的存储和访问效率更高。
  • 哈希部分的定义 :
    • 哈希部分用于存储非连续的整数索引 或非整数键(如字符串、浮点数、布尔值等)。
    • 哈希部分的存储和访问基于哈希表机制,时间复杂度通常为 O(1)。
  • 动态区分机制 :
    • lua 的表在内部维护一个数组部分 和一个哈希部分。
    • 当表的索引是连续的整数时,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 的名字命名。

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍

如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

相关推荐
高频因子挖掘机21 分钟前
历史行情返回顺序变了,为什么按行号计算指标很危险?
后端·github·api
益莱储中国31 分钟前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
benchmark_cc1 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu2 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
团子哒哒2 小时前
数组、切片和Map
后端
专注仿真2 小时前
ThinkPHP6 API接口开发实例:从零搭建RESTful风格接口
后端·php·restful
开心猴爷2 小时前
应对iOS审核4.3:可以使用 IpaGuard 来给属性名混淆的技术细节与平衡之道
后端·ios
1m555555552 小时前
RAG 工程实战(五):正确知识已经进入 Prompt,为什么大模型还是会答错?
后端·面试
CoderYanger2 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc