Menu
CoddyTech

显式的 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

虽然手动传递表格可行,但可能会让你觉得重复。下一课中,你将学习一种更简洁的语法,它可以自动处理这件事。

challenge icon

挑战

简单

创建一个名为 tracker 的表,并创建一个字段 count,将其初始化为 0。

添加一个函数 tracker.addAmount(self, amount),该函数:

  • 将 self(表)作为第一个参数接收
  • 将 amount 作为第二个参数接收
  • 将 amount 加到 self.count 上

你将收到两个输入:

  1. 要添加的第一个数值
  2. 要添加的第二个数值

对每个输入调用一次 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)
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Lua 在线编译器