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

【Lua】题目小练2

1.local t = {a = 1}

local mt = {

__index = function(table, key)

return key .. "_default"

end

}

setmetatable(t, mt)

print(t.a)

print(t.b)

1

b_default

2.观察并说明以下代码会不会报错,如果不会,最后输出什么:

MyClass = {}

MyClass.__index = MyClass

function MyClass:add(x)

return self.value + x

end

local obj = setmetatable({value = 10}, MyClass)

print(obj:add(5))

15

3.Parent = {}

Parent.__index = Parent

function Parent:new()

local self = setmetatable({}, Parent)

self.hp = 100

return self

end

function Parent:getHP()

        return self.hp

end

Child = {}

setmetatable(Child, {__index = Parent})

local c = Child:new()

print(c:getHP())

这个例子中,Child:new() 是如何调用的?为什么能工作?输出结果是多少?

在调用Child:new()方法的时候,由于Child本身是一个空的table,在此会调用元表的new()方法,即Person的new()方法,因此c被赋予了一个附带有Parent元表的空table,在执行c:getHP()的时候,由于自身是一个空table,因此会去访问元表的getHP方法,即Person:getHP()方法,最后输出100

4.

local t = {[1] = "a", [3] = "c", x = 7, [2] = "b"}

for i, v in ipairs(t) do

        print("ipairs", i, v)

end

for k, v in pairs(t) do

        print("pairs", k, v)

end

分别说明 ipairspairs 的输出行为(可以直接写出输出顺序)

ipairs()的输出为:ipairs1a,原因是ipairs的输出是先寻找了索引从1开始的,并且在遍历的中途不能断开

pairs()的输出为:

pairs1a

pairs2b

pairs3c

pairsx7

5.

下面的代码想实现一个类,但有 bug,试着找出并修改。

Enemy = {}

function Enemy:new(hp)

self.hp = hp

return self

end

function Enemy:hit(damage)

self.hp = self.hp - damage

end

local e = Enemy:new(100)

e:hit(10)

print(e.hp)

function Enemy:hit(damage)

         self.hp = self.hp - damage

         return self.hp

end

6.local t = setmetatable({}, {

__index = function(table, key)

return key .. "_default"

end

})

t[1] = "one"

print(t[1])

print(t[2])

one

2_default

7.

哪个写法可以正确实现 Lua 中的类继承?

A.

Child = {}

Child.__index = Parent

setmetatable(Child, Parent)

B.

Child = {}

setmetatable(Child, { __index = Parent })

C.

Child = setmetatable({}, Parent)

Child.__index = Child

D.

Child = Parent:new()

Child.__index = Child

A不可实现,中setmetatable(Child, Parent)并没有传入

B.可以实现

C.不可实现setmetatable({}, Parent)没有传入

D.可以实现,基于已有对象克隆方式通常配合Parent:new()返回对象设置好

8.

请写一个类 Player,它有属性 name 和 score,并且提供以下方法:


addScore(n):给分数加 n

printInfo():打印 name 和当前分数

local Player = {}

Player.__index = Person

function Player:new(name, score)

local obj = setmetatable({}, self)

        obj.nam = name or "UnKnow"

        obj.score = score or "UnKnow"

        return obj

end

function Player:addScore(n)

        self.score = self.score + n

end

http://www.xdnf.cn/news/1139077.html

相关文章:

  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘django’问题
  • vue-cli 模式下安装 uni-ui
  • JAVA面试宝典 -《Kafka 高吞吐量架构实战:原理解析与性能优化全攻略》
  • 图片上传实现
  • 多方案对比分析:后端数据加密策略及实践
  • Redis7 底层数据结构解析
  • Linux驱动14 --- 平台设备总线
  • JPA 与 MyBatis-Plus 数据库自增主键实现方案
  • GraphQL的N+1问题如何被DataLoader巧妙化解?
  • 【人工智能99问】梯度消失、梯度爆炸的定义、后果及规避手段?(7/99)
  • 使用位运算优化 Vue.js 应用:高效状态管理技巧
  • deep learning(李宏毅)--(六)--loss
  • 虚拟化测试工具Parasoft Virtualize如何为汽车企业提供仿真测试?
  • Helm-k8s包管理工具(一)核心概念、helm工作目录
  • 【Servo】伺服驱动器扫频功能方案文档
  • 有痛呻吟!!!
  • Redis面试相关问题总结
  • 离散与组合数学 杂记
  • 学习设计模式《十八》——备忘录模式
  • AI安全威胁之MCP Server投毒攻击实践
  • 深入理解进程等待:wait的简化与waitpid的灵活性
  • centos中新增硬盘挂载文件夹
  • 【FFmpeg 快速入门】本地播放器 项目
  • 林曦词典|文质彬彬
  • 物联网主机在化工园区安全风险智能化管控平台中的应用
  • mongodb 入门级别操作
  • 搞清MVCC
  • 优化 CSS 性能
  • 面试Redis篇-深入理解Redis缓存击穿
  • Selenium 启动的浏览器自动退出问题分析