显式的 self
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 2 课,共 70 课。
当函数位于表中时,它通常需要访问或修改同一张表中的数据。但问题来了:函数怎么知道自己属于哪张表呢?
解决方法是将表显式地作为第一个参数传递给函数。按照惯例,这个参数命名为 self:
local counter = {
value = 0
}
function counter.increment(self)
self.value = self.value + 1
end
counter.increment(counter)
print(counter.value) -- 输出:1注意,我们调用 counter.increment(counter),并将表本身作为参数传入。在函数内部,self 现在指向该表,这样我们就可以读取和修改 self.value。
这种模式很重要,因为它让函数无需硬编码表的名称,就能处理表中的数据。来看一个重置并返回当前计数的函数:
function counter.reset(self)
local old = self.value
self.value = 0
return old
end
print(counter.reset(counter)) -- 输出:1
print(counter.value) -- 输出:0虽然手动传递表格可行,但可能会让你觉得重复。下一课中,你将学习一种更简洁的语法,它可以自动处理这件事。
挑战
简单创建一个名为 tracker 的表,并创建一个字段 count,将其初始化为 0。
添加一个函数 tracker.addAmount(self, amount),该函数:
- 将
self(表)作为第一个参数接收 - 将
amount作为第二个参数接收 - 将
amount加到self.count上
你将收到两个输入:
- 要添加的第一个数值
- 要添加的第二个数值
对每个输入调用一次 tracker.addAmount,共调用两次,每次都将表作为第一个参数传入。两次调用后,打印 tracker.count 的最终值。
亲手试试
-- 读取输入
local amount1 = tonumber(io.read())
local amount2 = tonumber(io.read())
-- TODO:在下方编写你的代码
-- 创建一个名为 'tracker' 的表,其中的 'count' 字段初始值为 0
-- 添加函数 tracker.addAmount(self, amount),将 amount 加到 self.count 上
-- 调用 tracker.addAmount 两次,每次都将该表作为第一个参数
-- 输出最终的 count
print(tracker.count)这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Lua 在线编译器