【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,即 t 和 t.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
})