【Lua】题目小练1

发布于:2025-07-18 ⋅ 阅读:(20) ⋅ 点赞:(0)

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

})


网站公告

今日签到

点亮在社区的每一天
去签到