【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

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

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

✅

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

pairs()的输出为:

pairs1a

pairs2b

pairs3c

pairsx7

下面的代码想实现一个类,但有 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

})

t1 = "one"

print(t1)

print(t2)

✅

one

2_default

哪个写法可以正确实现 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()返回的对象设置好元表

请写一个类 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

相关推荐
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
SmalBox3 天前
02-07-原理篇-文件系统与跨平台适配
unity3d·游戏开发
只睡四小时3 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超3 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int3 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
CoderYanger3 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
伞伞悦读3 天前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json