Menu
CoddyTech

设置方法

本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 14 课,共 70 课。

Getter 方法让你通过受控的访问点读取内部数据。Setter 方法(也称为修改器方法)则恰恰相反。它们提供了一种受控的方式来修改内部状态。

你不直接赋值 car.speed = 50,而是调用 car:setSpeed(50):

local Car = {}
Car.__index = Car

function Car:new()
    local instance = {}
    setmetatable(instance, self)
    instance.speed = 0
    return instance
end

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

function Car:getSpeed()
    return self.speed
end

乍一看,这似乎只是为了得到相同的结果而增加了工作量。但当你之后需要添加规则时,setter 就会变得很有用。假设你想确保速度不会小于 0,也不会超过最大值:

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

现在,每次速度变化都会经过你的验证逻辑。任何使用 :setSpeed() 的代码都能自动应用这些检查,无需修改。这就是 setter 的真正价值。它们提供了一个统一的入口,让你控制数据如何变化,使对象更安全,也更易于维护。

challenge icon

挑战

简单

让我们来编写一个 Thermostat 类,通过 setter 方法智能地控制温度。温控器不会接受任意温度值,而是会设置合理的限制,让温度保持在舒适的范围内。

你需要将代码分成两个文件:

  • Thermostat.lua:使用标准的原型模式定义 Thermostat 类。每个温控器都应跟踪当前的 temperature。其中包括:
    • 一个 :new() 构造函数,将温度初始化为 20(一个舒适的默认值)
    • 一个 :getTemperature() getter,返回当前温度
    • 一个 :setTemperature(newTemp) setter,用于更新温度,但温度必须保持在限制范围内:最低为 10,最高为 30
  • main.lua:导入 Thermostat 模块并创建一个温控器实例。使用 setter 尝试更改不同的温度,观察这些限制如何生效。

你的 :setTemperature() 方法应遵循以下规则:

  • 如果新温度低于 10,就将其设为 10
  • 如果新温度高于 30,就将其设为 30
  • 否则,将其设为请求的值

你会收到两个输入:

  1. 要设置的第一个温度
  2. 要设置的第二个温度

在主文件中创建一个温控器,然后:

  1. 输出初始温度
  2. 将温度设为第一个输入值,并输出结果
  3. 将温度设为第二个输入值,并输出结果

每个温度单独占一行输出(只输出数字)。

例如,如果输入是 25 和 50,输出应为:

20
25
30

注意,第二次尝试将温度设为 50 时,结果是 30:setter 会自动执行最高温度限制!

亲手试试

-- 加载 Thermostat 模块
local Thermostat = require('Thermostat')

-- 读取输入
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())

-- TODO: 创建一个温控器实例

-- TODO: 打印初始温度

-- TODO: 将温度设置为 temp1 并打印结果

-- TODO: 将温度设置为 temp2 并打印结果
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Lua 在线编译器