当前位置: 首页 > news >正文

【Lua】题目小练1

1. 下面的代码会输出什么?

local t = { "a", "b", nil, "d" }

for i, v in ipairs(t) do

print(i, v)

end

1 a

2 b

ipairs 从索引 1 开始遍历,遇到第一个 nil(这里是索引 3)就停止了。

所以只输出第 1 和第 2 项。

———————————————————————————————————————————

2. 这段代码中 __index 的作用是什么?

local mt = {

__index = function(t, key)

return "找不到字段:" .. key

end

}

local t = setmetatable({}, mt)

print(t.name)

它是元方法,在例子中,由于 t.name 访问不到,这时它的元方法就会被调用,即 mt.__index 被调用,该方法需要传入参数 t 和对应的 key,即 tt.name

———————————————————————————————————————————

3. setmetatable({}, Person) 中的第二个参数是做什么的?

传入的是一个元表,用于在被 setmetatable 赋予的对象它被访问到未被定义的属性时触发,即触发 __index 的时候。

———————————————————————————————————————————

4. 下列代码会打印几次?为什么?

local t = { [1] = "one", [3] = "three", name = "Lua" }

for i, v in ipairs(t) do

print(i, v)

end

一次,只会打印出:1 one,因为 ipairs 方法遍历只能从 1 开始,并且每个索引的数字需要连续

———————————————————————————————————————————

5. 以下代码中,p:sayHi() 是如何找到 sayHi 函数的?

local Person = {}

Person.__index = Person

function Person:new(name)

local obj = setmetatable({}, self)

obj.name = name

return obj

end

function Person:sayHi()

print("Hi, I'm " .. self.name)

end

local p = Person:new("Alice")

p:sayHi()

p 是通过 new() 返回的一个空表,元表设置为 Person,当调用 p:sayHi() 时,由于 p 没有 sayHi 字段,Lua 会通过 __index 找到 Person.sayHi 来调用。

———————————————————————————————————————————

6. 补全代码:让 obj:add(5) 返回 15,其中 add 是类方法,base = 10

local MyClass = {}

MyClass.__index = MyClass

function MyClass:new()

local obj = setmetatable({}, self)

obj.base = 10

return obj

end

-- 在此补全 add 方法

function MyClass:add(num)

self.base = self.base + num

end

local obj = MyClass:new()print(obj:add(5))

———————————————————————————————————————————

❓ 7. 用 __index 实现一个“默认返回0”的表访问行为。

setmetatable(t, {

__index = function(_, key)

return 0

end

})

http://www.dtcms.com/a/284353.html

相关文章:

  • 九学王资源apk应用名称整理
  • 【机器学习实战【七】】机器学习特征选定与评估
  • ELN:生物医药科研的数字化引擎——衍因科技引领高效创新
  • 多线程(一) --- 线程的基础知识
  • 使用位运算优化 Vue.js 应用:高效状态管理技巧
  • Oracle 19.28 RU 升级最佳实践指南
  • 装饰器模式及优化
  • 大模型Agent应用开发实战:从框架选型到行业落地
  • 十六进制与嵌入式系统及通信系统
  • yolo8+ASR+NLP+TTS(视觉语音助手)
  • 基于Rust Softplus 函数实践方法
  • 【通识】网络的基础知识
  • 学习日志预告
  • 【测试100问】为什么要做接口测试?
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | GoodCheapFast(Good - Cheap - Fast三选二开关)
  • 区块链之Casper协议背景、演变发展、运作机制和潜在风险
  • 周志华《机器学习导论》第8章 集成学习 Ensemble Learning
  • 2025开源组件安全工具推荐OpenSCA
  • LVS(Linux virtual server)
  • AWS Lambda 最佳实践:构建高效无服务器应用的完整指南
  • 多维动态规划题解——最长公共子序列【LeetCode】记忆化搜索翻译成递推
  • CCS缺陷|冻干/灌装10大缺陷暴露无菌生产系统性漏洞:气流流型缺陷
  • 【android bluetooth 协议分析 03】【蓝牙扫描详解 3】【Bluetooth 中 EIR、IR、BLE 普通广播与扩展广播详解】
  • 数仓建设中,系统数据录入错误或者延迟,如何对历史数据修复或补入?
  • 安装物理机ubuntu系统
  • 初试Spring AI实现聊天功能
  • PyCharm 高效入门指南(引言 + 核心模块详解)
  • ubuntu22 npm install electron --save-dev 失败
  • 基于Rust游戏引擎实践(Game)
  • 智能体开发工具链全景图:IDE、调试器与监控平台