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
})
t[1] = "one"
print(t[1])
print(t[2])
✅
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